＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

                        PC-FXGAオーサリングソフトウェア
                    『ＧＭＡＫＥＲ』スタータキット(Ver.1.0)
                             ”ＶＬＩＢ．Ａ”の解説

                                        日本電気ホームエレクトロニクス株式会社
                                                        １９９５年１１月１０日

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

目次

第１章  HuC6261関連ライブラリ
１．１  HuC6261デバイスを初期化                          init_nt
１．２  HuC6261デバイスのセロファン・パラメータを設定    set_nt_cel
１．３  HuC6261デバイスのプライオリテイを設定            set_nt_pri
１．４  HuC6261デバイスのレインボー表示面の              set_crm_yuv
                            クロマキーパラメータを設定
１．５  HuC6261デバイスの各面に対する                    set_pallet_offset
                            パレット・オフセットを設定
１．６  HuC6261デバイスのカラーパレットRAMにデータを     write_pallet_datas
                                              書き込む
１．７  HuC6261デバイスの各デバイスの表示を設定          dispon
１．８  HuC6261デバイスの各デバイスの非表示を設定        dispoff
１．９  dispon_irq を初期化                              init_dispon_irq
１．10  dispon_req, dispoff_req での設定を               dispon_irq
                             HuC6261デバイスに設定する
１．11  HuC6261デバイスの各デバイスの表示を              dispon_req
                                     dispon_irq に要求
１．12  HuC6261デバイスの各デバイスの非表示を            dispoff_req
                                     dispon_irq に要求
１．13  HuC6261デバイスの各デバイスの                    cel_on
                            セロファン処理の有効を設定
１．14  HuC6261デバイスの各デバイスの                    cel_off
                            セロファン処理の無効を設定
１．15  HuC6261デバイスのスプライト面に対する            celsp_on
                    セロファン処理の有効パレットを設定
１．16  HuC6261デバイスのスプライト面に対する            celsp_off
                    セロファン処理の無効パレットを設定
１．17  HuC6261デバイスのプライオリテイを設定            set_nt_prio
１．18  HuC6261デバイスの表示モード等を設定              set_nt_mode

第２章  HuC6271関連ライブラリ
２．１  HuC6271デバイスを初期化                          init_rainbow
２．２  HuC6271デバイスをリセットし、                    reset_rainbow
                                直前のパラメータを設定
２．３  HuC6271デバイスの fts                            set_ra_fts
          (ブロック・ノイズ・フィルタ有効)ビットを設定
２．４  HuC6271デバイスの CHR (円筒有効)ビットを設定     set_ra_wrap
２．５  HuC6271デバイスの nrl パラメータを設定           set_ra_nrl
２．６  HuC6271デバイスのスクロール値を設定              set_ra_scroll

第３章  HuC6272関連ライブラリ
３．１  HuC6272デバイスを初期化                          init_king
３．２  各機能ブロックのアクセスする K-RAM の            set_kram_page
                                          ページを設定
３．３  K-RAM の読み出しアドレス、ページ、増減値を設定   set_kram_radr
３．４  K-RAM の書き込みアドレス、ページ、増減値を設定   set_kram_wadr
３．５  現在の K-RAM 読み出しアドレスを取得              get_kram_cradr
３．６  現在の K-RAM 書き込みアドレスの所得              get_kram_cwadr
３．７  HuC6272デバイスの _KRAM_DATA レジスタに          write_kram_datas
                                          データ書込み
３．８  HuC6272デバイスの _KRAM_DATA レジスタから        read_kram_datas
                                          データ読出し
３．９  MRAMからKRAMへデータ転送                         mram_to_kram
３．10  KRAMからMRAMへデータ読み込み                     kram_to_mram
３．11  KRAMを指定データでフィル                         fill_kram
３．12  KRAMを指定パターンでフィル                       fill_kramp
３．13  HuC6272・BG 各面の動作形式、                     set_bg_prams
                プライオリティ、円筒設定、サイズを設定
３．14  HuC6272・BG 各面の CG,BAT アドレスを設定         set_bgcg_adrs
３．15  HuC6272・BG 各面のスクロール値を設定             set_bg_scrls
３．16  HuC6272・BG 回転面のアフィン・パラメータを設定   set_bg_afins
３．17  HuC6272・BG のマイクロ・プログラムを書き替える   write_mp
３．18  HuC6272・BG のマイクロ・プログラムを有効にする   enable_mp
３．19  HuC6272・BG のマイクロ・プログラムの停止         disable_mp
３．20  HuC6272 の K-R バス(HuC6272<->HuC6271間)         set_kr_pram
                                  転送パラメータを設定
３．21  HuC6272 の K-R バス(HuC6272<->HuC6271間)転送の   set_kr_trans
                                      有効・無効を設定
３．22  HuC6272 のラスタインタラプトの有効・無効を設定   set_king_raster_irq
３．23  HuC6272 のラスタ監視レジスタに数値を設定         set_king_raster_count
３．24  HuC6272 の K-R バス(HuC6272<->HuC6230間)の       set_ks_pram
                                      パラメータを設定

第４章  HuC6230関連ライブラリ
４．１  HuC6230デバイスを初期化                          init_soundbox
４．２  HuC6230の ADPCM・DAC をリセット                  reset_adp
４．３  HuC6230の各 ADPCM チャンネルの                   set_adp_liner
                                  直線補間ビットを設定
４．４  HuC6230の ADPCM 再生レートを設定                 set_adp_rate
４．５  HuC6230の ADPCM 再生レベルを設定                 set_adp_vol
４．６  HuC6230の CD-PCM 再生レベルを設定                set_pcm_vol

第５章  HuC6270関連ライブラリ
５．１  HuC6270 デバイスを初期化                         init_70
５．２  HuC6270 のアドレスレジスタを設定                 set_70_ar
５．３  HuC6270 のステータスレジスタの値を返す           get_70_sr
５．４  HuC6270 のデータレジスタにデータを書き込む       set_70_dr
５．５  HuC6270 のコントロールレジスタを設定             set_70_cr
５．６  HuC6270 のレジスタを設定                         set_70_regs
５．７  HuC6270 の表示パラメータ                         setup_70_display
                   (mwr,hsr,hdr,vpr,vdw,vcr,dcr)を設定
５．８  HuC6270 に SAT バッファの転送をリクエスト        sat_trans_trg
５．９  HuC6270 のスクロールレジスタを設定               set_70_scrl
５．10  HuC6270 の _70_CR の IW bit を設定               set_70_iw
５．11  HuC6270 の _70_CR の現在設定されている           get_70_iw
                                           IW 値を返す
５．12  HuC6270 の _70_CR の指定された IE bit をセット   set_70_irqbit
５．13  HuC6270 の _70_CR の指定された                   reset_70_irqbit
                                     IE bit をリセット
５．14  HuC6270 の SB BB bit を設定                      set_70_mode
５．15  HuC6270 の表示モードを返す                       get_70_mode
５．16  HuC6270 の VRAM に書き込む                       write_vram
５．17  HuC6270 の VRAM から読み込む                     read_vram
５．18  HuC6270 の VRAM に MRAM にあるデータを書き込む   mram_to_vram
５．19  HuC6270 の VRAM にあるデータから                 vram_to_mram
                                       MRAM に読み込む
５．20  HuC6270 の VRAM を指定データでフィル             fill_vram
５．21  HuC6270 の VRAM を指定パターンでフィル           fill_vramp

第６章  PC-FXGA関連のライブラリ
６．１  cpuのインタラプトを許可                          irq_enable
６．２  cpuのインタラプトを禁止                          irq_disable
６．３  cpuの割り込み許可レベルを変更                    set_irq_level
６．４  各デバイスからの割り込み要求をマスク             set_irq_mask
６．５  各デバイスからの割り込み要求のマスクを解除       reset_irq_mask
６．６  各デバイスの割り込みレベルを設定                 set_irq_prio
６．７  割り込みハンドラを登録                           set_irq_vector
６．８  命令キャッシュを許可                             cache_enable
６．９  命令キャッシュを禁止                             cache_disable
６．10  命令キャッシュのエントリをクリア                 cache_clear
６．11  メモリ管理のコントロール領域を初期化             init_get_mem
６．12  指定したメモリ管理領域から、                     get_mem
                          利用可能なメモリを割り当てる
６．13  メモリ管理領域から確保したメモリの大きさを変更   resize_mem
６．14  メモリ管理ライブラリで確保したメモリを解放       free_mem
６．15  パッド読み込みルーチンを初期化する               init_get_pad
６．16  K_Port割り込みのハンドラ                         int_pad
６．17  K_Port割り込みの出力対応ハンドラ                 int_pado
６．18  パッドを読む                                     get_pad
６．19  int_pad, int_pado の動作モードを変更             set_get_pad_mode
６．20  reset_check の初期化                             init_reset_check
６．21  パッドからリセット操作がされたか判定             reset_check
６．22  soft_reset ベクタにジャンプ                      soft_reset
６．23  タイマを初期化                                   init_timer
６．24  タイマのカウンタ初期値を設定し、カウントを開始   start_timer
６．25  タイマのカウントを停止                           stop_timer
６．26  mram を指定データでフィル                        fill_mram
６．27  reg_set, reg_setb のテーブル領域を初期化         init_reg_set_tb
６．28  テーブルに書かれた内容をデバイスにセット         reg_set
６．29  テーブルに書かれた内容をデバイスにセット         reg_setb
６．30  reg_set のテーブルにデータをセット               req_reg_set
６．31  reg_setb のテーブルにデータをセット              req_reg_setb
６．32  ROM フォントのコードに対する                     font_adrs
                              フォントのアドレスを返す

付録  ＰＣ−ＦＸＧＡ内蔵ＲＯＭフォントパターンデータ構成図


−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ご注意

HuC6270,HuC6271関連のライブラリの説明がありますが、「ＧＭＡＫＥＲ」スタータキッ
トでは、HuC6270,HuC6271のデバイスの詳細説明はサポートしておりません。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第１章  HuC6261関連ライブラリ

HuC6261に関連する、プライオリティ、パレット、クロマキー、セロファンなどの各機
能の設定、変更を行なう一連の関数をとりまとめました。 


■１．１  HuC6261 デバイスを初期化


《名称》
init_nt
 
《形式》
#include <system.h>
#include <nt.h>
void init_nt(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call  init_nt 

《解説》
設定されるパラメータは次の通り。 

_NT_CR     $0002 全面非表示、インタレースモード、HuC6270 16色
_NT_CPA    $0000 パレット #0 を 黒に設定
_NT_CPW    $0088
_NT_CPO0   $0000 全面パレットオフセット 0
_NT_CPO1   $0000
_NT_CPO2   $0000
_NT_CPO3   $0000
_NT_PRI0   $0176 プライオリティを次の様に設定
_NT_PRI1   $2345 sp > bg > bg0 > bg1 > bg2 > bg3 > rainbow
_NT_CRMY   $0000 レインボー面自然画クロマキーは行なわない
_NT_CRMU   $0000
_NT_CRMV   $0000
_NT_FIXC   $0088 固定色面を 黒に設定
_NT_CELCR  $0000 全面セロファン非設定
_NT_CELSP  $0000
_NT_CEL1A  $0444 全セロファン・パラメータを
_NT_CEL1B  $0444 50% : 50% に設定
_NT_CEL2A  $0444
_NT_CEL2B  $0444
_NT_CEL3A  $0444
_NT_CEL3B  $0444
           
《注意》       
ハードウェア・リセットと設定内容が異なっているため気をつけてください。また、設
定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもしれ
ません。


■１．２  HuC6261 デバイスのセロファン・パラメータを設定


《名称》
set_nt_cel

《形式》
#include <system.h>
#include <nt.h>
void set_nt_cel(struct CELPRM *celp); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#AddressOfStructCELPRM'sTable,ra0
call set_nt_cel 

《解説》
次の様な構造のテーブルのアドレスを渡すことによって、HuC6261 デバイスの 
_NT_FIXC、_NT_CELCR、_NT_CELSP、_NT_CEL1A、_NT_CEL1B、_NT_CEL2A、_NT_CEL2B、
_NT_CEL3A、_NT_CEL3B 各レジスタにその内容を設定します。 

struct CELPRM {
u_short fixc;     /* _NT_FIXC :固定カラーレジスタ */
u_short celcr;    /* _NT_CELCR:セロファンコントロールレジスタ */
u_short celsp;    /* _NT_CELSP:スプライト・セロファン個別設定レジスタ */
u_short cel1A;    /* _NT_CEL1A:セロファン係数レジスタ 1A */
u_short cel1B;    /* _NT_CEL1B:セロファン係数レジスタ 1B */
u_short cel2A;    /* _NT_CEL2A:セロファン係数レジスタ 2A */
u_short cel2B;    /* _NT_CEL2B:セロファン係数レジスタ 2B */
u_short cel3A;    /* _NT_CEL3A:セロファン係数レジスタ 3A */
u_short cel3B;    /* _NT_CEL3B:セロファン係数レジスタ 3B */
}; 

《関連事項》
<nt.h>
"nt.sh" 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
struct CELPRM cell; 
:
cell.fixc = 0x1088;
cell.celcr = 0x8000|0x4000;
cell.celsp = 0xffff;
cell.cel1A = 0x0444;
cell.cel1B = 0x0444;
cell.cel2A = 0x0111;
cell.cel2B = 0x0777;
cell.cel3A = 0x0222;
cell.cel3B = 0x0666;
set_nt_cel(&cell);
:


■１．３  HuC6261 デバイスのプライオリテイを設定


《名称》
set_nt_pri

《形式》
#include <system.h>
#include <nt.h>
void set_nt_pri(struct NT_PRI *pri); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#AddressOfStructNT_PRI'sTable,ra0
call set_nt_pri 

《解説》
次の様な構造のテーブルのアドレスを渡すことによって、HuC6261 デバイスの 
_NT_PRI0、_NT_PRI1 各レジスタにその内容を設定します。 

struct NT_PRI {
u_short pri0;  /* _NT_PRI0:プライオリティレジスタ #0 */
u_short pri1;  /* _NT_PRI1:プライオリティレジスタ #1 */
}; 

《関連事項》
<nt.h>
"nt.sh" 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。
HuC6261 のプライオリティのみを設定するため、他のデバイスのプライオリティと矛盾
する設定を行なうと、予期しない表示となる場合があります。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
struct NT_PRI prio; 
:
prio.pri0 = 0x0765;
prio.pri1 = 0x4321; /* 71>70SP>70BG>BG3>BG2>BG1>BG0 */
set_nt_pri(&pri);
:


■１．４  HuC6261 デバイスのレインボー表示面のクロマキーパラメータを設定


《名称》
set_crm_yuv

《形式》
#include <system.h>
#include <nt.h>
void set_crm_yuv(struct NT_CRM *crm); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#AddressOfStructNT_CRM'sTable,ra0
call set_crm_yuv 

《解説》
次の様な構造のテーブルのアドレスを渡すことによって、HuC6261 デバイスの 
_NT_CRMY、_NT_CRMU、_NT_CRMV 各レジスタにその内容を設定します。 

struct NT_CRM {
u_short crmy;    /* _NT_CRMY:クロマキー Y レジスタ */
u_short crmu;    /* _NT_NRMU:クロマキー U レジスタ */
u_short crmv;    /* _NT_CRMV:クロマキー V レジスタ */
}; 

《関連事項》
<nt.h>
"nt.sh" 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
struct NT_CRM crm;
int ymax, umax, vmax;
int ymin, umin, vmin;
:
crm.crmy = (ymax << 8) + (ymin & 0xFF);
crm.crmu = (umax << 8) + (umin & 0xFF);
crm.crmv = (vmax << 8) + (vmin & 0xFF);
set_nt_crm(&crm);
:


■１．５  HuC6261 デバイスの各面に対するパレット・オフセットを設定 


《名称》
set_pallet_offset

《形式》
#include <system.h>
#include <nt.h>
void set_pallet_offset(struct NT_PLO *plo); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#AddressOfStructNT_PLO'sTable,ra0
call set_pallet_offset 

《解説》
次の様な構造のテーブルのアドレスを渡すことによって、HuC6261 デバイスの 
_NT_CPO0、_NT_CPO1、_NT_CPO2、_NT_CPO3 各レジスタにその内容を設定します。 

struct NT_PLO {
u_short cpo0;    /* _NT_CPO0:カラーパレットアドレスオフセット 0 */
u_short cpo1;    /* _NT_CPO1:カラーパレットアドレスオフセット 1 */
u_short cpo2;    /* _NT_CPO2:カラーパレットアドレスオフセット 2 */
u_short cpo3;    /* _NT_CPO3:カラーパレットアドレスオフセット 3 */
}; 

《関連事項》
<nt.h>
"nt.sh"
 
《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
struct NT_PLO plo; 
:
/* 6270BGは0から, 6270SPと6272及び6271は256からのカラーパレットを使う */
/* 6273を使う場合は、plo.cpo0は通常0x8000を設定します */
plo.cpo0 = 0x8000;
plo.cpo1 = 0x8080;
plo.cpo2 = 0x8080;
plo.cpo3 = 0x0080;
set_pallet_offset(&plo);
:


■１．６  HuC6261 デバイスのカラーパレットRAMにデータを書き込む 


《名称》
write_pallet_datas

《形式》
#include <system.h>
#include <nt.h>
void write_pallet_datas(u_short top, u_short *datas, int len); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.h #StartAddressOfPaletteRAM,ra0
mov.w#AddressOfPaletteData'sTable,ra1
mov.w#LengthOfTimesOfTransfer,ra2
call write_pallet_datas 

《解説》
書き込むパレットアドレスとデータのポインタ、書き込むパレット数を指定することに
よって、示されたデータを指定回数分、パレットアドレスから HuC6261 のパレットラ
ムに書き込みます。 

《関連事項》
<nt.h>
"nt.sh" 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
u_short databuf[512]; 
:
write_pallet_datas(0, databuf, 512);
:


■１．７  HuC6261 デバイスの各デバイスの表示を設定


《名称》
dispon

《形式》
#include <system.h>
#include <nt.h>
void dispon(int video_device_no); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#VideoDevice,ra0
call dispon 

《解説》
dispon は int video_device_no に渡された値を _NT_CR から読み出した値と OR した
値を _NT_CR に書き戻します。video_device_no には bg, spr, bg0,bg1, bg2, bg3, 
rain を書くことができます。また、video_device_no の指定は複数にすることが可能で
す。 
HuC6273を指定する場合は、bg|sprを指定してください
《関連事項》
<nt.h>
"nt.sh" 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
dispon(bg | spr);
:


■１．８  HuC6261 デバイスの各デバイスの非表示を設定


《名称》
dispoff

《形式》
#include <system.h>
#include <nt.h>
void dispoff(int video_device_no); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh"
include "nt.sh" 
mov.w#VideoDevice,ra0
call dispoff 

《解説》
dispoff は int video_device_no に渡された値を _NT_CR から読み出した値から除い
た値を _NT_CR に書き戻します。video_device_no には bg, spr, bg0,bg1, bg2, bg3, 
rain を書くことができます。また、video_device_no の指定は複数にすることが可能
です。
HuC6273を指定する場合は、bg|sprを指定してください

《関連事項》
<nt.h>
"nt.sh" 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
dispoff(bg|spr);
:


■１．９  dispon_irq を初期化 


《名称》
init_dispon_irq	

《形式》
#include <system.h>
#include <nt.h>
void init_dispon_irq(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call init_dispon_irq 

《解説》
init_dispon_irq は、dispon_irq に対する要求などをクリアします。
dispon_irq が最初に動作する以前に、実行しておいてください。 

《関連事項》
void dispon_req(int video_device_no);
void dispoff_req(int video_device_no);
void dispon_irq(void);


■１．10  dispon_req, dispoff_req での設定をHuC6261デバイスに設定する


《名称》
dispon_irq

《形式》
#include <system.h>
#include <nt.h>
void dispon_irq(void);
 
《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call	dispon_irq 

《解説》
dispon_irq は、dispon_req, dispoff_req で指定された各デバイスを、それぞれ、
表示、非表示に設定します。インタラプト期間(非表示期間)中に実行されることを前堤
としていますが、HuC6261 デバイスのアドレスレジスタの待避は行っていません。した
がって利用者がそれらを管理する必要があります。 

《関連事項》
void dispon_req(int video_device_no);
void dispoff_req(int video_device_no);
void init_dispon_irq(void); 

《注意》
非表示期間中であるかどうかはチェックしていません。


■１．11  HuC6261デバイスの各デバイスの表示をdispon_irq に要求


《名称》
dispon_req

《形式》
#include <system.h>
#include <nt.h>
void dispon_req(int video_device_no); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#VideoDevice,ra0
call dispon_req 

《解説》
dispon_req は、dispon_irq に対して各デバイスの表示を要求します。この設定は 
dispon_irq が実行された時から有効になります。また、video_device_no の指定は複
数にすることが可能です。 指定可能なデバイスには bg, spr, bg0, bg1,bg2, bg3
, rain があります。
HuC6273を指定する場合は、bg|sprを指定してください

《関連事項》
void dispoff_req(int video_device_no);
void dispon_irq(void);
void init_dispon_irq(void); 

《注意》
ここで指定した設定よりも、dispoff_req で指定した設定の方が優先されてしまいます。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
dispon_irq(bg0 | bg1 | bg2);
:


■１．12  HuC6261デバイスの各デバイスの非表示を dispon_irq に要求


《名称》
dispoff_req

《形式》
#include <system.h>
#include <nt.h>
void dispoff_req(int video_device_no); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#VideoDevice,ra0
call dispoff_req 

《解説》
dispoff_req は、dispon_irq に対して各デバイスの非表示を要求します。この設定は 
dispon_irq が実行された時から有効になります。また、video_device_no の指定は複
数にすることが可能です。 指定可能なデバイスには bg, spr, bg0, bg1, bg2, bg3, 
rain があります。 
HuC6273を指定する場合は、bg|sprを指定してください

《関連事項》
void dispon_req(int video_device_no);
void dispon_irq(void);
void init_dispon_irq(void);
 
《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
dispoff_irq(bg1 | bg2 | bg3);
:


■１．13  HuC6261 デバイスの各デバイスのセロファン処理の有効を設定


《名称》
cel_on

《形式》
#include <system.h>
#include <nt.h>
void cel_on(int video_device_no, int celunit); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#VideoDevice,ra0
mov.w#CelUnit,ra1
call cel_on

《解説》
cel_on は、int video_device_no で示された、デバイスに対するセロファン設定を行
います。
int celunit に、1〜3 を指定することによりセロファン係数レジスタ組の 1〜3を設定
します。
int video_device_no には、bg, spr, bg0,bg1, bg2, bg3, rain のほかに、bcel, fcel
としてバックセロファン、フロントセロファンの指定も可能で、それぞれのデバイス
は複数同時に指定することができます。 
HuC6273を指定する場合は、bg|sprを指定してください

《関連事項》
void cel_off(int video_device_no);
void celsp_on(int bank_bit);
void celsp_off(int bank_bit); 

《注意》
複数指定した場合に bcel, fcel を同時に指定してしまうとフロントセロファンの設定
になってしまいます。また、bcel, fcel 以外のデバイスに関しては、int celunit に 
0 を指定すると、Off になってしまいます。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
cel_on(bg2 | bg3 | fcel, 3);
:


■１．14  HuC6261 デバイスの各デバイスのセロファン処理の無効を設定


《名称》
cel_off

《形式》
#include <system.h>
#include <nt.h>
void cel_off(int video_device_no); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#VideoDevice,ra0
call cel_off 

《解説》
cel_off は、int video_device_no で示された、デバイスに対するセロファン設定を無
効にします。int video_device_no には、bg, spr, bg0, bg1, bg2, bg3,rain のほか
に、bcel, fcel としてバックセロファン、フロントセロファンの指定も可能で、それ
ぞれのデバイスは複数同時に指定することができます。 
HuC6273を指定する場合は、bg|sprを指定してください

《関連事項》
void cel_on(int video_device_no, int celunit);
void celsp_on(int bank_bit);
void celsp_off(int bank_bit); 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
cel_off(bg|spr); /* 6270BGとスプライトに対するセロファン設定無効 */
:


■１．15  HuC6261 デバイスのスプライト面に対するセロファン処理の有効パレットを
          設定


《名称》
celsp_on

《形式》
#include <system.h>
#include <nt.h>
void celsp_on(int bank_bit); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#BankBit,ra0
call celsp_on 

《解説》
cel_sp_on は、HuC6270 デバイスのスプライト面に対するセロファン処理が有効である
パレットバンクを設定します。int bank_bit には、有効にすべきパレットバンク番号
 0〜15 に対応するビット値を設定します。たとえば、パレットバンク2,3 を有効にし
たいときには 0x000C を設定します。 
HuC6273をセロファン指定する場合は、0xffffを指定してください

《関連事項》
void cel_on(int video_device_no, int celunit);
void cel_off(int video_device_no);
void celsp_off(int bank_bit); 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
celsp_on(0xffff);
:


■１．16  HuC6261 デバイスのスプライト面に対するセロファン処理の無効パレットを
          設定


《名称》
celsp_off

《形式》
#include <system.h>
#include <nt.h>
void celsp_off(int bank_bit);
 
《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#BankBit,ra0
call celsp_off 

《解説》
cel_sp_off は、HuC6270 デバイスのスプライト面に対するセロファン処理が無効であ
るパレットバンクを設定します。int bank_bit には、無効にすべきパレットバンク番号
 0〜15 に対応するビット値を設定します。たとえば、パレットバンク2,3 を無効にし
たいときには 0x000C を設定します。 
HuC6273のセロファン指定を無効にする場合は、0xffffを指定してください

《関連事項》
void cel_on(int video_device_no, int celunit);
void cel_off(int video_device_no);
void celsp_on(int bank_bit); 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
celsp_off(0x0C); /* パレットバンク 2,3 を無効に */
:


■１．17  HuC6261 デバイスのプライオリテイを設定


《名称》
set_nt_prio

《形式》
#include <system.h>
#include <nt.h>
void set_nt_prio(int video_dev_no, int prio); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#Priority,ra1
mov.w#VideoDevice,ra0
call set_nt_prio 

《解説》
set_nt_prio は、HuC6261 デバイスにおける int video_dev_no で示されるデバイスの
プライオリティを int prio の値に設定します。 
HuC6273を指定する場合は、bgとsprを指定してください

《関連事項》
void set_nt_pri(struct NT_PRI *pri); 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。
HuC6261 のプライオリティのみを設定するため、他のデバイスのプライオリティと矛盾
する設定を行なうと、予期しない表示となる場合があります。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
set_nt_prio(spr, 2); /* スプライトの表示優先順位を 2 に */
:


■１．18  HuC6261 デバイスの表示モード等を設定


《名称》
set_nt_mode

《形式》
#include <system.h>
#include <nt.h>
void set_nt_mode(int mode); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#Mode,ra0
call set_nt_mode 

《解説》
set_nt_mode は、HuC6261 デバイスの _NT_CR レジスタの動作モード設定を行ないます。
int mode には以下に示すモードを同時に複数指定可能です。 

ビデオモードグループ
interlace   インタレース表示を行ないます。
line263     ノンインタレース(263 line)表示を行ないます。
line262     ノンインタレース(262 line)表示を行ないます。
shift1by2   1/2 ドットシフト付インタレース表示を行ないます。

同期モードグループ
ext_sync    外部同期モード
inter_sync  内部同期モード
HuC6270     ドットクロックモードグループ
mode_7M     HuC6270及びHuC6273 320 ドットモード
mode_5M     HuC6270及びHuC6273 256 ドットモード

HuC6270 sp 面 256(240)色モードグループ
mode_sp256    HuC6270 sp 面 256(240)色モード
mode_sp16     HuC6270 sp 面 16色モード

HuC6270 bg 面 256(240)色モードグループ
mode_bg256    HuC6270 bg 面 256(240)色モード
mode_bg16     HuC6270 bg 面 16色モード 

《注意》
同じグループのモードを複数指定した場合に設定される値は、保証できません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <nt.h>
:
set_nt_mode(interlace | inter_sync | mode_7M | mode_sp256 | mode_bg256);
:


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第２章  HuC6271関連のライブラリ

HuC6271 デバイス関連の初期化、各フィルタースイッチなどの設定などを扱った関数を
とりまとめました。 


■２．１  HuC6271 デバイスを初期化


《名称》
init_rainbow

《形式》
#include <system.h>
#include <rainbow.h>
void init_rainbow(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call init_rainbow 

《解説》
init_rainbow は HuC6271 デバイスのソフトリセットを行ないます。
グローバル変数 zero struct RAREG m_ra_reg の内容をクリアします。 

《注意》
HuC6271のソフトリセットのため、3ラスタ期間ほど時間を消費します。
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。


■２．２  HuC6271デバイスをリセットし、直前のパラメータを設定


《名称》
reset_rainbow

《形式》
#include <system.h>
#include <rainbow.h>
void reset_rainbow(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call reset_rainbow 

《解説》
reset_rainbow は HuC6271 デバイスのソフトリセットを行ない、グローバル変数 zero 
struct RAREG m_ra_reg に設定されている内容で各パラメータを設定します。 

《関連事項》
init_rainbow 

《注意》
HuC6271のソフトリセットのため、3ラスタ期間ほど時間を消費します。
m_ra_reg の内容が不定の時は、使用しないでください。
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。


■２．３  HuC6271デバイスの fts (ブロック・ノイズ・フィルタ有効)ビットを設定


《名称》
set_ra_fts

形式
#include <system.h>
#include <rainbow.h>
void set_ra_fts(int sw);
 
《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#FTSbit,ra0
call set_ra_fts 

《解説》
set_ra_fts は HuC6271 デバイスの fts (ブロック・ノイズ・フィルタ有効)ビットを
設定し、その状態をグローバル変数 zero struct RAREG  m_ra_reg に記録します。int 
sw に FTS_ON を指定することにより有効に、FTS_OFF を指定することにより無効に設
定されます。 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <rainbow.h>
:
set_ra_fts(mode ? FTS_ON : FTS_OFF);
:


■２．４  HuC6271 デバイスの CHR (円筒有効)ビットを設定


《名称》
set_ra_wrap

《形式》
#include <system.h>
#include <rainbow.h>
void set_ra_wrap(int sw); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#CHRbit,ra0
call set_ra_wrap 

《解説》
HuC6271 デバイスの CHR (円筒有効)ビットを設定し、グローバル変数 zero struct 
RAREG m_ra_reg にその内容を記録します。int sw に WRAP_ON を指定することにより
円筒モードに、WRAP_OFF を指定することにより非円筒モードに設定されます。
 
《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。
 
《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <rainbow.h>
:
set_ra_wrap(mode ? WRAP_ON : WRAP_OFF);
:


■２．５  HuC6271 デバイスの nrl パラメータを設定


《名称》
set_ra_nrl

《形式》
#include <system.h>
#include <rainbow.h>
void set_ra_nrl(struct RA_NRL *nrl); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#AddressOfStructRA_NEL'sTable,ra0
call set_ra_rnl 

《解説》
以下の構造のテーブルを渡すことにより HuC6271 デバイスのヌル・ランレン・パラメ
ータを設定し、グローバル変数 zero struct RAREG m_ra_reg にその内容を記録します。

struct RA_NRL {
u_short nrly;    /* ヌルランレングスブロック YDC 成分 */
u_short nrlu;    /* ヌルランレングスブロック UDC 成分 */
u_short nrlv;    /* ヌルランレングスブロック VDC 成分 */
};

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <rainbow.h>
struct RA_NRL nrl; 
:
nrl.nrly = 0x71;
nrl.nrlu = 0x52;
nrl.nrlv = 0x1c;
set_ra_nrl(&nrl);
:


■２．６  HuC6271 デバイスのスクロール値を設定


《名称》
set_ra_scroll

《形式》
#include <system.h>
#include <rainbow.h>
void set_ra_scroll(u_short scroll); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.h #ScrollValue,ra0
call set_ra_scroll

《解説》
HuC6271 デバイスのスクロール値を設定し、その内容をグローバル変数zero struct 
RAREG m_ra_reg に記録します。 

《注意》
設定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもし
れません。
下位９ビットのみが符号付数値として有効です。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <rainbow.h>
u_short ra_scr_par; 
:
ra_scr_par = 1;
set_ra_scroll(ra_scr_par);
:


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第３章  HuC6272関連のライブラリ

HuC6272デバイス関連の関数をとりまとめました。 


■３．１  HuC6272 デバイスを初期化


《名称》
init_king

《形式》
#include <system.h>
#include <king.h>
void init_king(void);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call init_king 

《解説》
次のような内容で HuC6272 デバイスを設定します。

_BG_MPCR          $0000      ;マイクロプログラム動作停止
_KR_CR            $0000      ;KING-RAINBOW 転送停止
_KS_MODE          $0000      ;KING-SOUND_BOX 転送停止
_KRAM_MODE        $0001      ;４Ｍ(1Mbytes)モード
_SCSI_ODATA       $0000
_SCSI_ICMD        $0000
_SCSI_MODE        $0000
_SCSI_TCMD        $0000
_CDROM_SUBCTRL    $0000
_SCSI_DMACR       $0000
_KRAM_PAGE        $0000      ;全機能アクセス0ページ設定
_BG_MODE          $0000      ;全BG面未使用面設定
_BG_PRI           $0000      ;全BG面処理中止、回転面なし設定
_BG_SSCR          $0000      ;全面非茶筒設定
_BG_SIZE0         $8888      ;BG0 サイズ 256x256、副画面 256x256
_BG_SIZE1         $0088      ;BG1 サイズ 256x256
_BG_SIZE2         $0088      ;BG2 サイズ 256x256
_BG_SIZE3         $0088      ;BG3 サイズ 256x256
_BG_BSX0          $0000      ;BG0 X スクロール量 0
_BG_BSY0          $0000      ;BG0 Y スクロール量 0
_BG_BSX1          $0000      ;BG1 X スクロール量 0
_BG_BSY1          $0000      ;BG1 Y スクロール量 0
_BG_BSX2          $0000      ;BG2 X スクロール量 0
_BG_BSY2          $0000      ;BG2 Y スクロール量 0
_BG_BSX3          $0000      ;BG3 X スクロール量 0
_BG_BSY3          $0000      ;BG3 Y スクロール量 0
_BG_AFINA         $0100      ;回転時 Xx1 Yx1 回転角 0゜
_BG_AFINB         $0000
_BG_AFINC         $0000
_BG_AFIND         $0100
_BG_AFINX         $0080      ;回転中心 (80、80)
_BG_AFINY         $0080
_KS_CR0           $0000
_KS_CR1           $0000

《注意》
ハードウェア・リセットと設定内容が異なっているため気をつけてください。また、設
定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもしれ
ません。


■３．２  各機能ブロックのアクセスする K-RAM のページを設定


《名称》
set_kram_page

《形式》
#include <system.h>
#include <king.h>
void set_kram_page(int fbno, int page);
 
《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#Page,ra1
mov.w#FunctionBlockNum,ra0
call set_kram_page
 
《解説》
HuC6272 デバイスの各機能ブロックがどちらの K-RAM ページを使用するかを設定し
ます。int fbno に設定する機能ブロック番号として、

PAGE_SCSI でＳＣＳＩブロック
PAGE_BG でKING・ＢＧブロック
PAGE_KS でAD-PCM転送ブロック
PAGE_KR でレインボー転送ブロック のいずれかを、
int page に、KRAM_PAGE0、KRAM_PAGE1 のどちらかを渡します。 

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。
HuC6272・BG ブロックは、全てのBG面に対して、同一のページ設定しか行う事ができま
せん。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
:
set_kram_page(PAGE_KS, KRAM_PAGE1);
:


■３．３  K-RAM の読み出しアドレス、ページ、増減値を設定


《名称》
set_kram_radr

《形式》
#include <system.h>
#include <king.h>
void set_kram_radr(u_long addr, int page, int iw);
 
《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#KramAddr,ra0
mov.w#KramPage,ra1
mov.w#KramSkip,ra2
call set_kram_radr 

《解説》
set_kram_radr は、u_long addr に K-RAM の読み出しアドレス・バンク(バス)指定を、
int page には、KRAM_PAGE0、KRAM_PAGE1 のいずれかでページ指定を、int iw に K-RAM
の読み出し増減値(9Bit分でマスクされます。)を渡す事によって、CPU-KRAM アクセス
の読み出しパラメータを設定します。 

《関連事項》
u_long get_kram_cradr(void);
void read_kram_datas(u_short *dest, int len); 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
:
set_kram_radr(addr, KRAM_PAGE1, 8);
:


■３．４  K-RAM の書き込みアドレス、ページ、増減値を設定


《名称》
set_kram_wadr

《形式》
#include <system.h>
#include <king.h>
void set_kram_wadr(u_long addr, int page, int iw); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#KramAddr,ra0
mov.w#KramPage,ra1
mov.w#KramSkip,ra2
call set_kram_wadr
 
《解説》
set_kram_wadr は、u_long addr に K-RAM の書き込みアドレス・バンク(バス)指定を、
int page には、KRAM_PAGE0、KRAM_PAGE1 のいずれかでページ指定を、int iw に K-RAM
の書き込み増減値(9Bit分でマスクされます。)を渡す事によって、CPU-KRAM アクセス
の書き込みパラメータを設定します。 

《関連事項》
u_long get_kram_cwadr(void);
void write_kram_datas(u_short *sour, int len);
 
《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
:
set_kram_wadr(addr, KRAM_PAGE1, 8);
:


■３．５  現在の K-RAM 読み出しアドレスを取得


《名称》
get_kram_cradr

《形式》
#include <system.h>
#include <king.h>
u_long get_kram_cradr(void);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call get_kram_cradr

《解説》
get_kram_cradr は、次に CPU-KRAM 読み出しアクセスを行なった時に、実際に読み出さ
れる K-RAM アドレスを取得します。取得した値は、32ビット値で、MSB に ページ、
Bit18〜27 の9ビットに増減値、Bit17 にバンク(バス)、Bit0〜16 にアドレス情報が格
納されています。 

《関連事項》
void set_kram_radr(u_long addr,int page,int iw);
void write_kram_datas(u_short *sour, int len); 

《注意》
9ビットの増減値の MSB は、符号ビットです。 

ﾌﾟﾛｸﾞﾗﾑ例
#include <system.h>
#incldue <king.h>
u_long kramadr; 
:
kramadr = get_kram_cradr();
:


■３．６  現在の K-RAM 書き込みアドレスを取得


《名称》
get_kram_cwadr

《形式》
#include <system.h>
#include <king.h>
u_long get_kram_cwadr(void);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call get_kram_cwadr

《解説》
get_kram_cwadr は、次に CPU-KRAM 書き込みアクセスを行なった時に、実際に書き込
まれる K-RAM アドレスを取得します。取得した値は、32ビット値で、MSB に ページ、
Bit18〜27 の9ビットに増減値、Bit17 にバンク(バス)、Bit0〜16 にアドレス情報が格
納されています。 

《関連事項》
void set_kram_wadr(u_long addr,int page,int iw);
void write_kram_datas(u_short *sour, int len); 

《注意》
9ビットの増減値の MSB は、符号ビットです。 

ﾌﾟﾛｸﾞﾗﾑ例
#include <system.h>
#incldue <king.h>
u_long kramadr; 
:
kramadr = get_kram_cwadr();
:


■３．７  HuC6272 デバイスの _KRAM_DATA レジスタにデータ書込み


《名称》
write_kram_datas

《形式》
#include <system.h>
#include <king.h>
void write_kram_datas(u_short *sour, int len); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#DataPointer,ra0
mov.w#WriteLength,ra1
call write_kram_datas

《解説》
u_short *sour で示されたアドレスから、ハーフワードずつ int len の内容回だけ 
HuC6272 デバイスの _KRAM_DATA レジスタにデータを書き込みます。K-RAM アドレス、
増減量などが事前に設定されている必要があります。

《関連事項》
void set_kram_wadr(u_long addr, int page, int iw);
u_long get_kram_cwadr(void); 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
u_short buf[256];
:
set_kram_wadr(addr, KRAM_PAGE0, 2);
write_kram_datas(buf, 256);
:


■３．８  HuC6272 デバイスの _KRAM_DATA レジスタからデータ読出し


《名称》
read_kram_datas

《形式》
#include <system.h>
#include <king.h>
void read_kram_datas(u_short *dest, int len);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#DataPointer,ra0
mov.w#ReadLength,ra1
call read_kram_datas 

《解説》
u_short *dest に、int len の回数だけ、ハーフワードデータを HuC6272 デバイスの 
_KRAM_DATA レジスタから読み出します。K-RAM アドレス、増減量などが事前に設定さ
れている必要があります。 

《関連事項》
void set_kram_radr(u_long addr, int page, int iw);
u_long get_kram_cwadr(void); 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
u_short buf[256]; 
:
set_kram_radr(addr, KRAM_PAGE0, 2);
read_kram_datas(buf, 256);
:


■３．９  MRAMからKRAMへデータ転送


《名称》
mram_to_kram

《形式》
#include <system.h>
#include <king.h>
void mram_to_kram(int kadrs, u_short *kdata, int klength);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#KramAddr,ra0
mov.w#DataPointer,ra1
mov.w#Length,ra2
call mram_to_kram 

《解説》
u_short *kdata で示されるMRAM上のデータを int kadrs の指すKRAMに intklength ハ
ーフワード分転送します。int kadrs は $0004_0000 以上でページ1にそれ未満でページ
0に書き込みます。 

《関連事項》
void *kram_to_mram(int kadrs, u_short *kbuf, int klength);

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
:
mram_to_kram(0x0, mbuf, 256);
:


■３．10  KRAMからMRAMへデータ読み込み


《名称》
kram_to_mram

《形式》
#include <system.h>
#include <king.h>
void *kram_to_mram(int kadrs, u_short *kbuf, int klength); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#KramAddr,ra0
mov.w#MramAddr,ra1
mov.w#Length,ra2
call kram_to_mram

《解説》
kadrs で示される KRAM 上のデータを kbuf の指す MRAM に klength ハーフワード分
転送します。kadrs は $0004_0000 以上でページ 1 から、それ未満でページ 0 から読
み込みます。kbuf を返します。

《関連事項》
void mram_to_kram(int kadrs, u_short *kdata, int klength);

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
:
kram_to_mram(0x0, mbuf, 256);
:

Info file: VLib, -*-Text-*-
produced by texinfo-format-buffer
from file: vlib.texinfo 


■３．11  KRAMを指定データでフィル


《名称》
fill_kram

《形式》
#include <system.h>
#include <king.h>
void fill_kram(int kadrs, u_short value, int klength);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#KramAddr,ra0
mov.h #FillPattern,ra1
mov.w#Length,ra2
call fill_kram 

《解説》
fill_kram は、int kadrs から int klength 分、u_short value で KRAM をフィルし
ます。ページの指定は、int kadrs が $0004_0000 以上のとき Page1 、それ以外の時は
 Page0 になります。 

《関連事項》
void fill_kramp(int kvadrs, u_short *ptbl, int klength);

《注意》
ページやバンクをまたぐ様なフィルには対応していません。int klength が長過ぎる場
合は、同ページ同バンクで回りこみます。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
:
fill_kram(0x0, 0xAA55, 256);
:


■３．12  KRAMを指定パターンでフィル 


《名称》
fill_kramp

《形式》
#include <system.h>
#include <king.h>
void fill_kramp(int kadrs, u_short *ptbl, int klength);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#KramAddr,ra0
mov.w#PatternTable,ra1
mov.w#Length,ra2
call fill_kramp 

《解説》
fill_kramp は int kadrs から 、以下に示した構造の u_short *ptbl の内容を繰り返
し、int klength 分 KRAM をフィルします。ページの指定は、int kadrs が $0004_0000
以上のとき Page1 、それ以外の時は Page0 になります。 

ex_ptbl[] = {
u_short No_of_Pattern,
u_short Data0, Data1, … ,DataNo_of_Pattern - 1
}; 

《関連事項》
void fill_kram(int kvadrs, u_short value, int klength);

《注意》
ページやバンクをまたぐ様なフィルには対応していません。int klength が長過ぎる場
合は、同ページ同バンクで回りこみます。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
u_short pat[] = {
2，
0xAA,
0x55,
};
:
fill_kramp(0x0, pat, 256);
:


■３．13  HuC6272・BG 各面の動作形式、プライオリティ、円筒設定、サイズを設定


《名称》
set_bg_prams

《形式》
#include <system.h>
#include <king_bg.h>
void set_bg_prams(struct BGPRM *prm); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#ParPointer,ra0
call set_bg_prams 

《解説》
次に示したような構造のテーブルを渡すことによって、HuC6272・BG 各面の動作形式、
プライオリティ、円筒設定、サイズを設定します。 

struct BGPRM {
u_short kbgmode;    /* BG面形式設定  */
u_short kbgpri;     /* BG面プライオリティ設定 */
u_short sscr;       /* 副画面円筒表示設定 */
u_short size0;      /* BG0 サイズ */
u_short size1;      /* BG1 サイズ */
u_short size2;      /* BG2 サイズ */
u_short size3;      /* BG3 サイズ */
}; 

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king_bg.h>
struct BGPRM prm; 
:
prm.kbgmode = 0x0002;
prm.kbgpri = 0x1004;
prm.sscr = 0x0000;  
prm.size0 = 0x3333;
prm.size1 = 0x0033;
prm.size2 = 0x0033;
prm.size3 = 0x0033;
disable_mp();
set_bg_prams(&prm);
enable_mp();
:


■３．14  HuC6272・BG 各面の CG,BAT アドレスを設定 


《名称》
set_bgcg_adrs

《形式》
#include <system.h>
#include <king_bg.h>
void set_bgcg_adrs(struct BGCGADR *adr); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#ParPointer,ra0
call set_bgcg_adrs

《解説》
次に示すような構造のテーブルを渡すことによって、HuC6272・BG 各面の CG,BAT アド
レスを設定します。
 
struct BGCGADR {
u_short bat0;    /* BG0 主画面 BAT アドレス */
u_short cg0;     /* BG0 主画面 CG アドレス */
u_short sbat0;   /* BG0 副画面 BAT アドレス */
u_short scg0;    /* BG0 副画面 CG アドレス */
u_short bat1;    /* BG1 主副画面 BAT アドレス */
u_short cg1;     /* BG1 主副画面 CGT アドレス */
u_short bat2;    /* BG2 主副画面 BAT アドレス */
u_short cg2;     /* BG2 主副画面 CG アドレス */
u_short bat3;    /* BG3 主副画面 BAT アドレス */
u_short cg3;     /* BG3 主副画面 CG アドレス */
}; 

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。
 
《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king_bg.h>
struct BGCGADR adr; 
:
adr.bat0 = 0x00;
adr.cg0 = 0x10;
adr.sbat0 = 0x20;
adr.scg0 = 0x30;
adr.bat1 = 0x40;
adr.cg1 = 0x50;
adr.bat2 = 0x60;
adr.cg2 = 0x70
adr.bat3 = 0x80;
adr.cg3 = 0x90;
set_bgcg_adrs(&adr);
:


■３．15  HuC6272・BG 各面のスクロール値を設定


《名称》
set_bg_scrls

《形式》
#include <system.h>
#include <king_bg.h>
void set_bg_scrls(struct BGSCRL *scrl); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#ParPointer,ra0
call set_bg_scrls

《解説》
次に示す様な構造のテーブルを引数にすることよって、HuC6272・BG 各面のスクロール
値を設定します。 

struct BGSCRL {
u_short bsx0;    /* BG0 水平スクロール */
u_short bsy0;    /* BG0 垂直スクロール */
u_short bsx1;    /* BG1 水平スクロール */
u_short bsy1;    /* BG1 垂直スクロール */
u_short bsx2;    /* BG2 水平スクロール */
u_short bsy2;    /* BG2 垂直スクロール */
u_short bsx3;    /* BG3 水平スクロール */
u_short bsy3;    /* BG3 垂直スクロール */
}; 

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king_bg.h>
struct BGSCRL bgscr; 
:
bgscr.bsx0 = 0;
bgscr.bsy0 = 0;
bgscr.bsx1 = 0;
bgscr.bsy1 = 0;
bgscr.bsx2 = 0;
bgscr.bsy2 = 0;
bgscr.bsx3 = 0;
bgscr.bsy4 = 0;
set_bg_scrls(&bgscr);
:


■３．16  HuC6272・BG 回転面のアフィン・パラメータを設定


《名称》

set_bg_afins

形式
#include <system.h>
#include <king_bg.h>
void set_bg_afins(struct AFIN *afin); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#ParPointer,ra0
call set_bg_afins 

《解説》
次の様な構造のテーブルを渡すことによって、HuC6272・BG 回転面のアフィン・パラメ
ータを設定します。 

struct AFIN {
u_short afina;  /* アフィン係数 A */
u_short afinb;  /* アフィン係数 B */
u_short afinc;  /* アフィン係数 C */
u_short afind;  /* アフィン係数 D */
u_short afinx;  /* アフィン係数 中心 X 座標*/
u_short afiny;  /* アフィン係数 中心 Y 座標*/
}; 

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king_bg.h>
struct AFIN afin; 
:
afin.afina = 0x0080;
afin.afinb = 0x0000;
afin.afinc = 0x0000;
afin.afind = 0x0080;
afin.afinx = 0x0000;
afin.afiny = 0x0000;
set_bg_afins(&afin);
:


■３．17  HuC6272・BG のマイクロ・プログラムを書き替える


《名称》
write_mp

《形式》
#include <system.h>
#include <king_bg.h>
void write_mp(int mpadr, u_short *mprg, int len);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#MPAddr,ra0
mov.w#MProgram,ra1
mov.w#Length,ra2
call write_mp

《解説》
write_mp は、現在のマイクロ・プログラム動作状態を待避したうえで、その動作を停
止し、マイクロ・プログラム・アドレス int mpadr から、int len 回数だけ、u_short 
*mprg で示された内容を、マイクロ・プログラムとして書き換え、待避した動作状態を
復帰します。

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king_bg.h>
int mpadr;
u_short mprogtab[]={  /*マイクロプログラム 非回転*/
/*+---------- 1:NOP  0:usable
  |+--------- BG number High
  ||+-------- BG number Low
  |||+------- 1:Afine on 0:Afine off
  |||| */
0b000000000,
0b000000001,
0b000000010,
0b000000011,
0b000000100,
0b000000101,
0b000000110,
0b000000111,    /*64K/16Mcolor mode. use BG_0*/

0b100000000,
0b100000000,
0b100000000,
0b100000000,
0b100000000,
0b100000000,
0b100000000,
0b100000000,
/*    |||||
      ||||+-- CG offset Low
      |||+--- CG offset Middle
      ||+---- CG offset High
      |+----- 1:BAT usable 0:BAT unusable
      +------ 1:is BAT 0:is CG
*/
};
:
write_mp(mpadr, mprogtab, sizeof(mprogtab) / sizeof(u_short));
enable_mp();
:


■３．18  HuC6272・BG のマイクロ・プログラムを有効にする


《名称》
enable_mp

《形式》
#include <system.h>
#include <king_bg.h>
void enable_mp(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call enable_mp 

《解説》
enable_mp は、HuC6272・BG のマイクロ・プログラムを有効にします。
 
《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。


■３．19  HuC6272・BG のマイクロ・プログラムの停止


《名称》
disable_mp

《形式》
#include <system.h>
#include <king_bg.h>
void disable_mp(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
call disable_mp 

《解説》
disable_mp は、HuC6272・BG のマイクロ・プログラムを停止します。 

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。


■３．20  HuC6272 の K-R バス(HuC6272<->HuC6271間)転送パラメータを設定


《名称》
set_kr_pram

《形式》
#include <system.h>
#include <king_kr.h>
void set_kr_pram(struct KR *krp);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#ParPointer,ra0
call set_kr_pram

《解説》
次の様な構造のテーブルを渡すことによって、HuC6272 の K-R バス
(HuC6272<->HuC6271間)転送パラメータを設定します。 

struct KR {
u_long krstart;     /* HuC6271 データスタートアドレス */
u_short krraster;   /* HuC6271 転送開始ラスタ */
u_short krblock;    /* HuC6271 転送ブロック数レジスタ */
}; 

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king_kr.h>
struct KR krp;
:
krp.krstart = 0;
krp.krraster = 22;
krp.krblock = 14;
set_kr_pram(&krp);
:


■３．21  HuC6272 の K-R バス(HuC6272<->HuC6271間)転送の有効・無効を設定


《名称》
set_kr_trans

《形式》
#include <system.h>
#include <king.h>
void set_kr_trans(int mode);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#Mode,ra0
call set_kr_trans 

《解説》
set_kr_trans は、HuC6272 の K-R バス(HuC6272<->HuC6271間)転送の有効・無効を設
定します。
int mode に KR_TRANS_ON を渡すことにより転送を有効に、KR_TRANS_OFF を渡すこと
により転送を無効に設定します。また、この内容はグローバル変数 zero struct 
KINGREG m_king_regにも記録されます。 

《関連事項》
void set_king_raster_irq(int mode); 

《注意》
設定タイミングをみていませんので、表示中に使用した場合ノイズが気になるかもしれ
ません。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
int mode;
:
set_kr_trans(mode ? KR_TRANS_ON : KR_TRANS_OFF);
:


■３．22  HuC6272 のラスタインタラプトの有効・無効を設定 


《名称》
set_king_raster_irq

《形式》
#include <system.h>
#include <king.h>
void set_king_raster_irq(int mode);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w#Mode,ra0
call set_king_raster_irq 

解説
set_king_raster_irq は HuC6272 のラスタインタラプトの有効・無効を設定します。
int mode に KING_RASTER_IRQ_ON を渡すことによって有効に、KING_RASTER_IRQ_OFF 
を渡すことによって無効に設定されます。また、この内容はグローバル変数 zero 
struct KINGREG m_king_reg にも記録されます。 

《関連事項》
void set_king_raster_count(u_short count);
void set_kr_trans(int mode);

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
int mode;
:
set_king_raster_irq(mode ? KING_RASTER_IRQ_ON : KING_RASTER_IRQ_OFF);
:


■３．23  HuC6272 のラスタ監視レジスタに数値を設定


《名称》
set_king_raster_count

《形式》
#include <system.h>
#include <king.h>
void set_king_raster_count(u_short count); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.h #Count,ra0
call set_king_raster_count 

《解説》
set_king_raster_count は、u_short count の内容を HuC6272 の ラスタ監視レジスタ
に数値を設定します。この内容は m_king_reg にも記録されます。

《関連事項》
void set_king_raster_irq(int mode); 

《注意》
有効な数値は 0 から 262 までで、0 は垂直帰線期間の始まりを示しています。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king.h>
u_short count;
:
set_king_raster_count(count);
:



■３．24  HuC6272 の K-R バス(HuC6272<->HuC6230間) のパラメータを設定


《名称》
set_ks_pram

《形式》
#include <system.h>
#include <king_ks.h>
void set_ks_pram(struct KS *ksp); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "lib.sh" 
mov.w #ParPointer,ra0
call set_ks_pram 

《解説》
次のような構造のテーブルを渡すことによって、HuC6272 の K-R バス
(HuC6272<->HuC6230間)転送のパラメータを設定します。 

struct KS {
u_short ksmode;    /* HuC6230 再生モード */
u_short kscr0;     /* HuC6230 バッファ制御 #0 */
u_short kscr1;     /* HuC6230 バッファ制御 #1 */
u_short ksstart0;  /* HuC6230 #0 スタートアドレス */
u_long ksend0;     /* HuC6230 #0 エンドアドレス */
u_short kshalf0;   /* HuC6230 #0 ハーフアドレス */
u_short ksstart1;  /* HuC6230 #1 スタートアドレス */
u_long ksend1;     /* HuC6230 #1 エンドアドレス */
u_short kshalf1;   /* HuC6230 #1 ハーフアドレス */
}; 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <king_ks.h>
struct KS ksp;
:
ksp.ksmode = 0x03;   /* サンプリング周波数 31.49KHz/#0#1 enable */
ksp.kscr0 = 0x02;    /* #0 シーケンシャルバッファ/END時割り込み */
ksp.kscr1 = 0x02;    /* #1 シーケンシャルバッファ/END時割り込み */
ksp.ksstart0 = 0x00000 >> 8;
ksp.ksend0 = 0x00800;
ksp.kshalf0 = 0x00400 >> 6;
ksp.ksstart1 = 0x01000 >> 8;
ksp.ksend1 = 0x01800;
ksp.kshalf1 = 0x01400 >> 6;
set_ks_pram(&ksp);
:


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第４章  HuC6230関連のライブラリ

HuC6230関連の関数をとりまとめました。 


■４．１  HuC6230 デバイスを初期化


《名称》
init_soundbox

《形式》
#include <system.h>
#include <soundbox.h>
void init_soundbox(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "soundbox.sh" 
call init_soundbox 

《解説》
HuC6230 デバイスを初期化します。
各ボリュームを 0 にし、m_adp_cr を クリアします。 


■４．２  HuC6230 の ADPCM・DAC をリセット


《名称》
reset_adp

《形式》
#include <system.h>
#include <soundbox.h>
void reset_adp(int resetch); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "soundbox.sh" 
mov.w#ResetChannel,ra0
call reset_adp 

《解説》
HuC6230 の ADPCM・DAC をリセットします。int resetch に ADP_RESET_0 を指定する
ことにより Ch #0 を、ADP_RESET_1 を指定することにより Ch #1 を、ADP_RESET_ALL 
を指定することにより両方のチャンネルをリセットします。同時にm_adp_cr に記録さ
れていた状態に、直線補間、再生レートを設定します。 

《注意》
ノイズが発生すると考えられますので、事前にボリュームを下げてください。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <soundbox.h>
int ch;
:
reset_adp(ch);
:


■４．３  HuC6230の各 ADPCM チャンネルの直線補間ビットを設定


《名称》
set_adp_liner

《形式》
#include <system.h>
#include <soundbox.h>
void set_adp_liner(int ch, int sw); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "soundbox.sh" 
mov.w#Channel,ra0
mov.w#Linear,ra1
call set_adp_liner 

《解説》
HuC6230 の各 ADPCM チャンネルの直線補間ビットを設定します。
int ch で指定したチャンネルの直線補間ビットの状態を int sw で指定した状態に設
定し、m_adp_cr にも記録します。int ch に設定するチャンネル指定は、SB_ADPCM_0 
で Ch #0 が、SB_ADPCM_1 で Ch #1 が、SB_ADPCM_ALL で両チャンネルが撰択され、
int sw に ADP_LINER_ON を指定することにより直線補間を有効に、ADP_LINER_OFF を
指定することにより無効に設定します。

《関連事項》
void reset_adp(int reset);

《注意》
reset_adp を呼び出すために、ノイズが発生すると考えられますので、事前にボリュー
ムを下げてください。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <soundbox.h>
int ch, sw;
:
set_adp_liner(ch, sw);
:


■４．４  HuC6230 の ADPCM 再生レートを設定


《名称》
set_adp_rate

《形式》
#include <system.h>
#include <soundbox.h>
void set_adp_rate(int rate); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "soundbox.sh" 
mov.w#Rate,ra0
call set_adp_rate 

《解説》
HuC6230 の ADPCM 再生レートを設定します。
int rate に ADPCM_RATE32 を指定することにより 32KHz に、ADPCM_RATE16 を指定す
ることにより 16KHz に、ADPCM_RATE8 を指定することにより 8KHz に、ADPCM_RATE4 
を指定することにより 4KHz に設定し、m_adp_cr にも記録します。 

《関連事項》
void reset_adp(int reset); 

《注意》
reset_adp を呼び出すために、ノイズが発生すると考えられますので、事前にボリュー
ムを下げてください。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <soundbox.h>
int rate;
:
set_adp_rate(rate);
:


■４．５  HuC6230 の ADPCM 再生レベルを設定


《名称》
set_adp_vol

《形式》
#include <system.h>
#include <soundbox.h>
void set_adp_vol(struct ADPVOL *vols);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "soundbox.sh" 
mov.w#StructureOfVolumesPointer,ra0
call set_adp_vol 

《解説》
以下の構造のテーブルを渡すことによって、HuC6230 の ADPCM 再生レベルを設定しま
す。

struct ADPVOL {
u_char avoll0; /* ADPCM #1 L ボリューム */
u_char avolr0; /* ADPCM #1 R ボリューム */
u_char avoll1; /* ADPCM #2 L ボリューム */
u_char avolr1; /* ADPCM #2 R ボリューム */
}; 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <soundbox.h>
struct ADPVOL adpvol;
:
adpvol.avoll0 = 0x3F;
adpvol.avolr0 = 0x3F;
adpvol.avoll1 = 0x3D;
adpvol.avolr1 = 0x3D;
set_adp_vol(&adpvol);
:


■４．６  HuC6230 の CD-PCM 再生レベルを設定


《名称》
set_pcm_vol

《形式》
#include <system.h>
#include <soundbox.h>
void set_pcm_vol(struct PCMVOL *vols);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "soundbox.sh" 
mov.w#StructureOfVolumesPointer,ra0
call set_pcm_vol 

《解説》
以下の構造のテーブルを渡すことにより HuC6230 の CD-PCM 再生レベルを設定します。

struct PCMVOL {
u_char pvoll;    /* PCM L ボリューム */
u_char pvolr;    /* PCM R ボリューム */
}; 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <soundbox.h>
struct PCMVOL pcmvol;
:
pcmvol.pvoll = 0x04;
pcmvol.pvolr = 0x04;
set_pcm_vol(&pcmvol);
:


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第５章  HuC6270関連のライブラリ

HuC6270関連の関数をとりまとめました。 


■５．１  HuC6270 デバイスを初期化


《名称》
init_70

《形式》
#include <system.h>
#include <sup.h>
void init_70(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
call init_70 

《解説》
HuC6270 をイニシャライズする。設定されるパラメータは次の通り。 

_70_CR    $0000;SP,BG非表示、INT Off、IW = +1
_70_RCR   $0000;invalid H Irq
_70_BXR   $0000;BGスクロール値 0
_70_BYR   $0000;BGスクロール値 0
_70_MWR   $0000;BGサイズ 256x256
_70_HSR   $0202;HDS = $02, HSW = $02
_70_HDR   $041f;HDE = $04, HDW = $1f
_70_VPR   $1102;VDS = $11, VSW = $02
_70_VDW   $00ef;VDW = $ef
_70_VCR   $0002;VCR = $02
_70_DCR   $0000;Clear DMA 

《関連事項》
void setup_70_display(struct DP70 *pram, int devno); 

《注意》
ハードウェア・リセットと設定内容が異なっているため気をつけてください。また、設
定タイミングをみていませんので、表示中に使用した場合、ノイズが気になるかもしれ
ません。


■５．２  HuC6270 のアドレスレジスタを設定


《名称》
set_70_ar

《形式》
#include <system.h>
#include <sup.h>
void set_70_ar(int regno, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#Regno,ra0
mov.w#Devno,ra1
call set_70_ar 

《解説》
HuC6270 のアドレスレジスタを設定します。
int devno で指定した、DEV70A もしくは DEV70B のいずれかのデバイスのアドレスレ
ジスタを int regno の内容で設定します。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
int regno, devno;
:
set_70_ar(regno, devno);
:


■５．３  HuC6270 のステータスレジスタの値を返す 


《名称》
get_70_sr

《形式》
#include <system.h>
#include <sup.h>
u_short get_70_sr(int devno);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w #Devno,ra0
call get_70_ar 

《解説》
HuC6270 のステータスレジスタの値を返します。
int devno で指定した、DEV70A もしくは DEV70B のいずれかのデバイスのステータス
レジスタの内容を読み出します。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
int devno, status;
:
status = get_70_sr(devno);
:


■５．４  HuC6270 のデータレジスタにデータを書き込む 


《名称》
set_70_dr

《形式》
#include <system.h>
#include <sup.h>
void set_70_dr(u_short data, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.h #Data,ra0
mov.w #Devno,ra1
call set_70_dr 

《解説》
HuC6270 のデータレジスタにデータを書き込みます。
int devno で指定した、DEV70A もしくは DEV70B のいずれかのデバイスのデータレジ
スタを u_short data の内容で設定します。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
u_short dat;
:
set_70_dr(dat, DEV70A);
:


■５．５  HuC6270 のコントロールレジスタを設定 


《名称》
set_70_cr

《形式》
#include <system.h>
#include <sup.h>
void set_70_cr(int crdat, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.#ControlData,ra0
mov.w#Devno,ra1
call set_70_cr

《解説》
set_70_cr は int devno で指定された DEV70A もしくは DEV70B いずれかの HuC6270 
のコントロールレジスタを int crdat の内容で設定し、m_70_reg.cr[devno] にも記録
します。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
int crdat;
:
set_70_cr(crdat, DEV70B);
:


■５．６  HuC6270 のレジスタを設定


《名称》
set_70_regs

《形式》
#include <system.h>
#include <sup.h>
void set_70_regs(struct REG70 *regs, int evno);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#StructureOfRegs,ra0
mov.w#Devno,ra1
call set_70_regs 

《解説》
set_70_regs は 以下の構造のテーブルを渡すことにより int devno で指定された 
DEV70A もしくは DEV70B いずれかの HuC6270 のレジスタを設定します。 

struct REG70 {
u_short regno;  /* レジスタ番号 */
u_short regdat; /* レジスタに設定する値 */
}; 
struct REG70 table[] = {
{regno, regdat},
・
・
{REGTERM, REGTERM}  /* 終端 */
}; 

《注意》
_70_CR は、この関数で設定しないでください。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
struct REG70 table[] = {
{_70_RCR, 0x80},
{_70_BXR, 0x00},
{_70_BYR, 0x00},
{REGTERM, REGTERM}
}; 
:
set_70_regs(table, DEV70A); /* HuC6270 A port の設定 */
:


■５．７  HuC6270 の表示パラメータ(mwr,hsr,hdr,vpr,vdw,vcr,dcr)を設定


《名称》
setup_70_display

《形式》
#include <system.h>
#include <sup.h>
void setup_70_display(struct DP70 *pram, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#ParPointer,ra0
mov.w#Devno,ra1
call setup_70_display 

《解説》
以下の構造のテーブルを渡すことにより int devno で指定された DEV70A もしくは 
DEV70B いずれかの HuC6270 の表示パラメータ(mwr,hsr,hdr,vpr,vdw,vcr,dcr)を設定
します。

struct DP70 {
u_short mwr;    /* メモリ幅 */
u_short hsr;    /* 水平同期 */
u_short hdr;    /* 水平表示 */
u_short vpr;    /* 垂直同期 */
u_short vdw;    /* 垂直表示 */
u_short vcr;    /* 垂直表示エンド位置 */
u_short dcr;    /* DMA コントロール */
}; 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
struct DP70 dp70;
:
dp70.mwr = 0x0050;  /* MWR 64*64 , 1 DOT space */
dp70.hsr = 0x0202;  /* HSR (HDS= 2 / HSW= 2) */
dp70.hdr = 0x041F;  /* HDR (HDE= 4 / HDW=31) */
dp70.vpr = 0x1102;  /* VPR (VDS=17 / VSW= 2) */
dp70.vdw = 0x00EF;  /* VDW=239    */
dp70.vcr = 0x0002;  /* VCR= 8 v=261 laster   */
dp70.dcr = 0x0000;  /* DCR  */
setup_70_display(&dp70, DEV70A);
:


■５．８  HuC6270 に SAT バッファの転送をリクエスト


《名称》
sat_trans_trg

《形式》
#include <system.h>
#include <sup.h>
void sat_trans_trg(u_short sat_adrs, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.h #SAT_Addr,ra0
mov.w#Devno,ra1
call sat_trans_trg 

《解説》
sat_trans_trg は int devno で指定された DEV70A もしくは DEV70B いずれかの 
HuC6270 に u_short sat_adrs の VRAM アドレスからの SAT バッファへの DMA 転送を
リクエストします。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
u_short sat_adr;
:
sat_trans_trg(sat_adr, DEV70A);
:


■５．９  HuC6270 のスクロールレジスタを設定


《名称》
set_70_scrl

《形式》
#include <system.h>
#include <sup.h>
void set_70_scrl(struct SCRL70 *scrl, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#ParPointer,ra0
mov.w#Devno,ra1
call set_70_scrl 

《解説》
以下の構造のテーブルを渡すことによって、int devno で指定された DEV70A もしくは 
DEV70B いずれかの HuC6270 のスクロールレジスタを設定します。 

struct SCRL70 {
u_short bxr70;  /* BGX スクロール */
u_short byr70;  /* BGY スクロール */
}; 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
struct SCRL70 scrl70;
:
scrl70.bxr70 = 0;
scrl70.byr70 = 0;
set_70_scrl(&scrl70, DEV70A);
:


■５．10  HuC6270 の _70_CR の IW bit を設定


《名称》
set_70_iw

《形式》
#include <system.h>
#include <sup.h>
void set_70_iw(int iw_data, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#IW_Data,ra0
mov.w#Devno,ra1
call set_70_iw 

《解説》
get_70_iw は、int devno で指定された DEV70A もしくは DEV70B いずれかの HuC6270
 の _70_CR の IW bit を int iw_data の内容で設定します。
V_RAM アクセス時のインクリメント幅は、IW_01 で 1、IW_20 で 0x20、IW_40 で 0x40
、IW_80 で 0x80 となります。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
:
set_70_iw(IW_01, DEV70A);
:


■５．11   HuC6270 の _70_CR の現在設定されている IW 値を返す 


《名称》
get_70_iw

《形式》
#include <system.h>
#include <sup.h>
int get_70_iw(int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#Devno,ra0
call get_70_iw 

《解説》
get_70_iw は、int devno で指定された DEV70A もしくは DEV70B いずれかの HuC6270
 の _70_CR の現在設定されているIW値を返します。

《注意》
m_70_reg.cr[devno] を読み出しているにすぎませんので、現実の設定と異なる場合も
あります。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
int iw70;
:
iw70 = get_70_iw(DEV70A);
:


■５．12  HuC6270 の _70_CR の指定された IE bit をセット 


《名称》
set_70_irqbit

《形式》
#include <system.h>
#include <sup.h>
int set_70_irqbit(int irqbit, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#IRQ_Bit,ra0
mov.w#Devno,ra1
call set_70_irqbit 

《解説》
set_70_irqbit は int devno で指定された DEV70A、DEV70B いずれかのデバイスの int
irqbit で指定された IE ビットをセットし、変更後の IE ビットを返します。int 
irqbit として、IE_CC で衝突検出割り込みを、IE_OC でオーバー検出割り込みを、
IE_RC でラスタ検出割り込みを、IE_VC で垂直帰線期間検出割り込みを選択します。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
:
set_70_irqbit(IE_VC, DEV70A);
:


■５．13  HuC6270 の _70_CR の指定された IE bit をリセット


《名称》
reset_70_irqbit

《形式》
#include <system.h>
#include <sup.h>
int reset_70_irqbit(int irqbit, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#IRQ_Bit,ra0
mov.w#Devno,ra1
call reset_70_irqbit 

《解説》
reset_70_irqbit は int devno で指定された DEV70A、DEV70B いずれかのデバイスの 
int irqbit で指定された IE ビットをリセットし、変更後の IE ビットを返します。
int irqbit として、IE_CC で衝突検出割り込みを、IE_OC でオーバー検出割り込みを、
IE_RC でラスタ検出割り込みを、IE_VC で垂直帰線期間検出割り込みを選択します。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
:
reset_70_irqbit(IE_VC, DEV70A);
:


■５．14  HuC6270 の SB BB bit を設定 


《名称》
set_70_mode

《形式》
#include <system.h>
#include <sup.h>
void set_70_mode(int mode, int devno);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#Mode,ra0
mov.w#Devno,ra1
call set_70_mode 

《解説》
set_70_mode は int devno で指定( DEV70A or DEV70B )した HuC6270 の SB BBビット
を int mode で指定した内容で設定します。int mode に BURST を指定することにより
バーストモードに、SPR_ON を指定することによりスプライトのみを表示に、BG_ON を
指定することによりＢＧのみを表示に、SPR_BG_ON を指定することにより両方を表示に
設定します。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
:
set_70_mode(SPR_ON, DEV70A);
:


■５．15  HuC6270 の表示モードを返す 


《名称》
get_70_mode

《形式》
#include <system.h>
#include <sup.h>
int get_70_mode(int devno);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.w#Devno,ra0
call get_70_mode 

《解説》
get_70_mode は int devno(DEV70A or DEV70B) で指定した HuC6270 の表示モードを読
み出します。取りうる値は BURST, SPR_ON, BG_ON, SPR_BG_ON です。 

《注意》
グローバル変数 u_short m_70_reg.cr[devno] を読み出しているにすぎませんので、現
実の設定と異なる場合もあります。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
int mode70;
:
mode70 = get_70_mode(DEV70A);
:


■５．16  HuC6270 の VRAM に書き込む 


《名称》
write_vram

《形式》
#include <system.h>
#include <sup.h>
void write_vram(u_short vadrs, u_short vdata, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.h #VRAM_Addr,ra0
mov.h #Data,ra1
mov.w#Devno,ra2
call write_vram 

《解説》
write_vram は int devno で指定( DEV70A or DEV70B )した VRAM のアドレス u_short 
vadrs へ、u_short vdata を書き込みます。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
u_short vadrs;
u_short vdata;
:
write_vram(vadrs, vdata, DEV70A);
:


■５．17  HuC6270 の VRAM から読み込む 


《名称》
read_vram

《形式》
#include <system.h>
#include <sup.h>
u_short read_vram(u_short vadrs, int devno);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.h #VRAM_Addr,ra0
mov.w#Devno,ra1
call read_vram 

《解説》
read_vram は int devno で指定( DEV70A or DEV70B )した VRAM のアドレス u_short
 vadrs からデータを読み込みます。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
u_short vadrs;
u_short vdata;
:
vdata = read_vram(vadrs, DEV70A);
:


■５．18  HuC6270 の VRAM に MRAM にあるデータを書き込む 


《名称》
mram_to_vram

《形式》
#include <system.h>
#include <sup.h>
void mram_to_vram(u_short vadrs, u_short *vdata, int len, int devno);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.h #VRAM_Addr,ra0
mov.w#DataPointer,ra1
mov.w#Length,ra2
mov.w#Devno,ra3
call mram_to_vram

《解説》
mram_to_vram は MRAM の u_short *vdata から、int devno で指定( DEV70A or 
DEV70B )した VRAM のアドレス u_short vadrs へ、int len ハーフワード分書き込み
ます。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
u_short vadrs;
u_short *vdata;
int buflen;
:
mram_to_vram(vadrs, vdata, buflen, DEV70A);
:


■５．19  HuC6270 の VRAM にあるデータから MRAM に読み込む 


《名称》
vram_to_mram

《形式》
#include <system.h>
#include <sup.h>
u_short *vram_to_mram(u_short vadrs, u_short *buff, int len, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.h #VRAM_Addr,ra0
mov.w#BufPointer,ra1
mov.w#Length,ra2
mov.w#Devno,ra3
call vram_to_mram 

《解説》
vram_to_mram は int devno で指定( DEV70A or DEV70B )した VRAM のアドレス 
u_short vadrs から、MRAM の u_short *buff に、int len ハーフワード分読み込み、
読み込んだバッファの先頭アドレスを返します。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
u_short vadrs;
u_short *vdata;
int buglen;
:
mram_to_vram(vadrs, vdata, buflen, DEV70A);
:


■５．20  HuC6270 の VRAM を指定データでフィル


《名称》
fill_vram

《形式》
#include <system.h>
#include <sup.h>
void fill_vram(u_short svadrs, u_short value, u_short vlength, int devno);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.h #VRAM_Addr,ra0
mov.h #FillValue,ra1
mov.h #Length,ra2
mov.w#Devno,ra3
call fill_vram 

《解説》
fill_vram は int devno で指定( DEV70A or DEV70B )した VRAM のアドレス u_short
svadrs から、u_short value を、u_short vlength 回書き込みます。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
u_short vadrs;
u_short vdata;
u_short fill_len;
:
fill_vram(vadrs, vdata, fill_len, DEV70A);
:


■５．21  HuC6270 の VRAM を指定パターンでフィル


《名称》
fill_vramp

《形式》
#include <system.h>
#include <sup.h>
void fill_vramp(u_short svadrs, u_short *ptbl, u_short vlength, int devno); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "sup.sh" 
mov.h #VRAM_Addr,ra0
mov.w#PatPointer,ra1
mov.h #Length,ra2
mov.w#Devno,ra3
call fill_vramp 

《解説》
fill_vramp は int devno で指定( DEV70A or DEV70B )した VRAM のアドレス u_short 
svadrs から、以下に示した構造の u_short *ptbl の内容を繰り返し、u_short vlength
回書き込みます。 

ex_ptbl[] = {
u_short No_of_Pattern,
u_short Data0, Data1, … ,DataNo_of_Pattern - 1
}; 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <sup.h>
u_short vadrs;
u_short *pattern;
u_short fill_len;
:
fill_vramp(vadrs, pattern, fill_len, DEV70A);
:


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第６章  PC-FXGA関連のライブラリ

SYSTEM BOARD関連の関数をとりまとめました。


■６．１  cpuのインタラプトを許可


《名称》
irq_enable

《形式》
#include <system.h>
#include <v93.h>
void irq_enable(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call irq_enable
 
《解説》
cpuのインタラプトを許可する。pswのIDbitをクリアするだけです。


■６．２  cpuのインタラプトを禁止


《名称》
irq_disable

《形式》
#include <system.h>
#include <v93.h>
void irq_disable(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call irq_disable

《解説》
cpuのインタラプトを禁止する。pswのIDbitをセットするだけです。


■６．３  cpuの割り込み許可レベルを変更


《名称》
set_irq_level

《形式》
#include <system.h>
#include <v93.h>
void set_irq_level(int irq_level);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#IRQ_Level,ra0
call set_irq_level

《解説》
cpuの割り込み許可レベルを変更する。下位の4ビットのみが有効です。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
:
set_irq_level(0x000F);
:


■６．４  各デバイスからの割り込み要求をマスク


《名称》
set_irq_mask

《形式》
#include <system.h>
#include <v93.h>
void set_irq_mask(u_short mask);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.h #IRQ_Mask,ra0
call set_irq_mask

《解説》
各デバイスからの割り込み要求をマスクします。u_short maskには、BIT_IRQM_SIO, 
BIT_IRQM_7B, BIT_IRQM_KING, BIT_IRQM_7A, BIT_IRQM_KP,BIT_IRQM_EXT, BIT_IRQM_TMI
, BIT_IRQM_AERR などを指定します。orや+などで複数指定も可能です。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
:
set_irq_mask(BIT_IRQM_7A | BIT_IRQM_7B);
:


■６．５  各デバイスからの割り込み要求のマスクを解除


《名称》
reset_irq_mask

《形式》
#include <system.h>
#include <v93.h>
void reset_irq_mask(u_short mask); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.h #IRQ_Mask,ra0
call reset_irq_mask

《解説》
各デバイスからの割り込み要求のマスクを解除します。u_short maskには、
BIT_IRQM_SIO, BIT_IRQM_7B, BIT_IRQM_KING, BIT_IRQM_7A, BIT_IRQM_KP,BIT_IRQM_EXT
, BIT_IRQM_TMI, BIT_IRQM_AERR などを指定します。orや+などで複数指定も可能です。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
:
reset_irq_mask(BIT_IRQM_7A | BIT_IRQM_7B);
:


■６．６  各デバイスの割り込みレベルを設定


《名称》
set_irq_prio

《形式》
#include <system.h>
#include <v93.h>
void set_irq_prio(int prio, int device_no);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w #Priority,ra0
mov.w #Devno,ra1
call set_irq_prio
 
《解説》
各デバイスからの割り込み要求のレベルを設定。int prioには、割り込み要求があった
ときに返すレベルを0〜7(IRQ_PRIO8〜IRQ_PRIOF)で,int device_noには設定するデバイ
スをIRQ_EXT,IRQ_70B,IRQ_KING,IRQ_70A,IRQ_KP,IRQ_FDC,IRQ_TIMERで指定します。 

IRQ_EXT       拡張バス 割り込み
IRQ_70B       7UP #B 割り込み
IRQ_KING      KING 割り込み
IRQ_70A       7UP #A 割り込み
IRQ_KP        Key Port 割り込み
IRQ_FDC       FDC 割り込み
IRQ_TIMER     TIMER 割り込み
IRQ_TRAP1X    TRAP 1X 割り込み
SOFT_RESET    SOFT RESET 割り込み
MATH_ERR      算術エラー 割り込み 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
extern void time_irq(void);
:
set_irq_prio(IRQ_PRIO8, IRQ_TIMER);
set_irq_vector(&time_irq, IRQ_LEVEL8);
:


■６．７  割り込みハンドラを登録


《名称》
set_irq_vector

《形式》
#include <system.h>
#include <v93.h>
void set_irq_vector(void (*handler)(), int vector); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#FuncPointer,ra0
mov.w#IntVector,ra1
call set_irq_vector

《解説》
set_irq_vector は int vector で指定した割り込みベクタに void *handler() で示さ
れる割り込みハンドラを登録します。

割り込みベクタ
IRQ_LEVELF    IRQ Level F 割り込み
IRQ_LEVELE    IRQ Level E 割り込み
IRQ_LEVELD    IRQ Level D 割り込み
IRQ_LEVELC    IRQ Level C 割り込み
IRQ_LEVELB    IRQ Level B 割り込み
IRQ_LEVELA    IRQ Level A 割り込み
IRQ_LEVEL9    IRQ Level 9 割り込み
IRQ_LEVEL8    IRQ Level 8 割り込み 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
extern void matherr(void);
:
set_irq_vector(&matherr, IRQ_LEVEL8);
set_irq_prio(IRQ_PRIO8, MATH_ERR);
:


■６．８  命令キャッシュを許可


《名称》
cache_enable

《形式》
#include <system.h>
#include <v93.h>
void cache_enable(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call cache_enable 

《解説》
命令キャッシュを許可します。


■６．９  命令キャッシュを禁止


《名称》
cache_disable

《形式》
#include <system.h>
#include <v93.h>
void cache_disable(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call cache_disable 

《解説》
命令キャッシュを禁止します。


■６．10  命令キャッシュのエントリをクリア


《名称》
cache_clear

《形式》
#include <system.h>
#include <v93.h>
void cache_clear(void);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call cache_clear

《解説》
命令キャッシュのエントリをクリアします。
命令キャッシュは禁止されます。


■６．11  メモリ管理のコントロール領域を初期化 


《名称》
init_get_mem

《形式》
#include <system.h>
#include <v93.h>
void init_get_mem(void *top, int size); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#MemoryHandler,ra0
mov.w#Length,ra1
call init_get_mem

《解説》
メモリ管理のコントロール領域を初期化します。
void *top に管理したいメモリ領域の先頭アドレスを、int size に管理したいメモリ
領域の大きさを渡します。 

《関連事項》
void *get_mem(void *top, int size);
void *resize_mem(void *top, void *ptr, int newsize);
int free_mem(void *top, void *ptr); 

《注意》
void *top はワード境界をまたがないようにしなくてはなりません。
また、void *top はメモリ管理ライブラリの利用に必要ですので保持してください。
コントロール領域のために 1.2K Bytes 必要とします、そのため int size は充分な大
きさを指定する必要があります。1 つの管理領域で確保できるメモリは、127領域にす
ぎません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
void *_HSTA;
:
_HSTA = 0x10000;
init_get_mem(_HSTA, 0x2000);
:


■６．12  指定したメモリ管理領域から、利用可能なメモリを割り当てる 


《名称》
get_mem

《形式》
#include <system.h>
#include <v93.h>
void *get_mem(void *top, int size);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#MemoryHandler,ra0
mov.w#Length,ra1
call get_mem 

《解説》
指定したメモリ管理領域から、利用可能なメモリを割り当てます。
get_mem は、void *top で示されたメモリ管理領域から int size バイトのメモリを確
保し、確保したメモリの先頭アドレスを返します。ただし、確保の失敗した時には NULL
(0) ポインタを返します。 

《関連事項》
void init_get_mem(void *top, int size);
void *resize_mem(void *top, void *ptr, int newsize);
int free_mem(void *top, void *ptr); 

《注意》
確保するメモリをワード・アラインメントするため、余分なメモリが割り当てられる場
合があります。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
void *_HSTA;
void *hp;
:
hp = get_mem(_HSTA, 0x10);
:


■６．13  メモリ管理領域から確保したメモリの大きさを変更


《名称》
resize_mem

《形式》
#include <system.h>
#include <v93.h>
void *resize_mem(void *top, void *ptr, int newsize); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#MemoryHandler,ra0
mov.w#NewMemPointer,ra1
mov.w#Length,ra2
call resize_mem

《解説》
メモリ管理領域から確保したメモリの大きさを変更します。
resize_mem は、void *top で示されたメモリ管理領域の void *ptr から確保したメモ
リの大きさを int newsize に変更し、確保したメモリの先頭アドレスを返します。
ただし、変更に失敗した場合 NULL(0) を返します。(確保していた領域のアドレス・サ
イズ・内容・属性は一切変化しません。) 

《関連事項》
void init_get_mem(void *top, int size);
void *get_mem(void *top, int size);
int free_mem(void *top, void *ptr);

《注意》
確保していたメモリの移動を行なわないため、領域の拡大に成功するためには、その領
域に連続した空きメモリが存在する必要があります。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
void *_HSTA;
void *hp, *newp;
int newlen;
:
newp = resize_mem(_HSTA, hp, newlen);
:


■６．14  メモリ管理ライブラリで確保したメモリを解放


《名称》
free_mem

《形式》
#include <system.h>
#include <v93.h>
int free_mem(void *top, void *ptr); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#MemoryHandler,ra0
mov.w#MemPointer,ra1
call free_mem 

《解説》
メモリ管理ライブラリで確保したメモリを解放します。free_mem は、void *top で示
された管理メモリ領域内の void *ptr から始まる確保済領域を解放します。解放に失
敗したときにはNULL (0) を返します。 

《関連事項》
void init_get_mem(void *top, int size);
void *get_mem(void *top, int size);
void *resize_mem(void *top, void *ptr, int newsize); 

《注意》
解放した直後に再確保しても、同じ領域が確保されるとはかぎりません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
void *_HSTA;
void *hp;
:
free_mem(_HSTA, hp);
:


■６．15  パッド読み込みルーチンを初期化する


《名称》

init_get_pad

《形式》
#include <system.h>
#include <v93.h>
void init_get_pad(void);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call init_get_pad 

《解説》
パッド読み込みルーチンを初期化します。
u_short padC0,padC1をKC_IN+KC_TAP+(KEYDATA*6)に設定します。このpadCxの設定値で
int_pad,int_padoはコントロールされています。上の設定ではタップシーケンスで5パ
ッドまで読み込みます。ハンドラがint_padoの場合にはKC_OUTも加えて設定することが
でき、その場合出力シーケンスを追加します。
各パッドの読み込まれたデータや出力すべきデータはK_Port0側がpad00,pad01,pad02,
pad03,pad04,pad05、K_Port1側がpad10,pad11,pad12,pad13,pad14,pad15から次の構造
体として読み書きできます。

struct KEYDATA {
u_int KD_INT;    /* 作業用ワーク */
u_int KD_DAT;    /* パッドデータ */
u_int KD_TRG;    /* トリガリングデータ */
u_int KD_OUT;    /* 出力するデータ */
}; 

u_int KD_INTは作業用ワークです。u_int KD_DATがパッドデータでsignatureも含んで
います。u_int KD_TRGはKD_DATにトリガリング処理を行ったデータです。
u_int KD_OUTは出力すべきデータでget_padを呼ぶ前までにはセットされていなければ
なりません。(ハンドラがint_padoで出力も指定したときのみアクセスされます) 

《関連事項》
void int_pad(void);
void int_pado(void);
void get_pad(void);
void set_get_pad_mode(int port_no, int mode, int no_of_pad); 


■６．16  K_Port割り込みのハンドラ


《名称》
int_pad

《形式》
#include <system.h>
#include <v93.h>
void interrupt int_pad(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#int_pad,ra0
mov.w#IRQ_KP,ra1
call set_irq_vector 

《解説》
K_Port割り込みのハンドラです。get_padを呼ぶ前に、K_Port割り込みの割り込みベク
タに登録しておく必要があります。割り込みが抑止されていると無意味です。
各パッドの読み込まれたデータや出力すべきデータはK_Port0側がpad00,pad01,pad02,
pad03,pad04,pad05、K_Port1側がpad10,pad11,pad12,pad13,pad14,pad15から次の構造
体として読み書きできます。 

struct KEYDATA {
u_int KD_INT;    /* 作業用ワーク */
u_int KD_DAT;    /* パッドデータ */
u_int KD_TRG;    /* トリガリングデータ */
u_int KD_OUT;    /* 出力するデータ */
}; 

u_int KD_INT は作業用ワークです。u_int KD_DAT がパッドデータで signature も含
んでいます。
u_int KD_TRG は KD_DAT にトリガリング処理を行ったデータです。
u_int KD_OUT は出力すべきデータで get_pad() を呼ぶ前までにはセットされていなけ
ればなりません。(ハンドラが int_pado() で出力も指定したときのみアクセスされま
す) 

《関連事項》
void set_irq_vector(void (*handler)(), int vector); 
void init_get_pad(void);
void int_pado(void);
void get_pad(void);
void set_get_pad_mode(int port_no, int mode, int no_of_pad); 


■６．17  K_Port割り込みの出力対応ハンドラ


《名称》
int_pado

《形式》
#include <system.h>
#include <v93.h>
void interrupt int_pado(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#int_pado,ra0
mov.w#IRQ_KP,ra1
call set_irq_vector 

《解説》
K_Port 割り込みのハンドラです。get_pad() を呼ぶ前に、K_Port 割り込みの割り込み
ベクタに登録しておく必要があります。割り込みが抑止されていると無意味です。
u_short padC0, padC1 に KD_OUT も指定すると出力シーケンスを追加実行します。
各パッドの読み込まれたデータや出力すべきデータは K_Port0 側が pad00, pad01,
pad02, pad03, pad04, pad05、K_Port1 側が pad10, pad11, pad12, pad13, pad14,
pad15 から次の構造体として読み書きできます。 

struct KEYDATA {
u_int KD_INT;    /* 作業用ワーク */
u_int KD_DAT;    /* パッドデータ */
u_int KD_TRG;    /* トリガリングデータ */
u_int KD_OUT;    /* 出力するデータ */
}; 

u_int KD_INT は作業用ワークです。u_int KD_DAT がパッドデータで signature も含
んでいます。
u_int KD_TRG は KD_DATにトリガリング処理を行ったデータです。
u_int KD_OUT は出力すべきデータで get_pad() を呼ぶ前までにはセットされていなけ
ればなりません(ハンドラが int_pado で出力も指定したときのみアクセスされます)。 

《関連事項》
void set_irq_vector(void (*handler)(), int vector); 
void init_get_pad(void);
void int_pad(void);
void get_pad(void);
void set_get_pad_mode(int port_no, int mode, int no_of_pad); 


■６．18  パッドを読む


《名称》
get_pad

《形式》
#include <system.h>
#include <v93.h>
void get_pad(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call get_pad 

《解説》
パッドを読みます。パッドデータの整理やトリガリング処理、パッド読み込みのリクエ
ストなどを行ないます。
各パッドの読み込まれたデータや出力すべきデータは K_Port0 側が pad00, pad01,
pad02, pad03, pad04, pad05、K_Port1 側が pad10, pad11, pad12, pad13, pad14,
pad15 から次の構造体として読み書きできます。

struct KEYDATA {
u_int KD_INT;    /* 作業用ワーク */
u_int KD_DAT;    /* パッドデータ */
u_int KD_TRG;.   /* トリガリングデータ */
u_int KD_OUT;    /* 出力するデータ */
}; 

u_int KD_INTは作業用ワークです。u_int KD_DATがパッドデータでsignatureも含んで
います。u_int KD_TRG は KD_DATにトリガリング処理を行ったデータです。
u_int KD_OUT は出力すべきデータで get_pad() を呼ぶ前までにはセットされていなけ
ればなりません(ハンドラが int_pado() で出力も指定したときのみアクセスされます)。

《関連事項》
void init_get_pad(void);
void int_pad(void);
void get_pad(void);
void set_get_pad_mode(int port_no, int mode, int no_of_pad); 

《注意》
最初の１回のパッドデータやトリガリング・データは無意味です。
int_padやint_padoの処理が継続中に使用すると正しい結果が得られません。通常10個
分のパッドデータの送受に1/2V程度かかりますので1V程度の間隔を空けて呼んでくださ
い。または、u_short  padS0,padS1の内容をKC_IN+KC_OUTでアンドした結果が0である
ことを確認してから呼んでください。


■６．19  int_pad, int_pado の動作モードを変更


《名称》
set_get_pad_mode

《形式》
#include <system.h>
#include <v93.h>
void set_get_pad_mode(int port_no, int mode, int no_of_pad); 

《ｱｾﾝﾌﾞﾗ形式》
include "c62dev.sh"
nclude "v93.sh" 
mov.w#Portno,ra0
mov.w#Mode,ra1
mov.w#NumberOfPad,ra2
call set_get_pad_mode 

《解説》
set_get_pad_mode は int_pad, int_pado の動作モードを変更します。
int port_no には設定すべきポート番号を 0 か 1 で指定し、int mode に 動作モード
として KC_IN, KC_OUT, KC_TAP の組み合せを、int no_of_pad にはマルチタップシー
ケンスのときに読み込むべきパッドの数を指定します。ただし、KC_TAP を指定しない
時には 1 を指定してください。
KC_TAPを指定する時には、必ずマルチタップのシグネチャーまでリードするようにマル
チタップのコネクタ数+1（通常5）を指定してください。
 
《関連事項》
void init_get_pad(void);
void int_pad(void);
void int_pado(void);
void get_pad(void); 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
:
set_get_pad_mode(0, KC_IN, 1);
:


■６．20  reset_check の初期化


《名称》
init_reset_check

《形式》
#include <system.h>
#include <v93.h>
void init_reset_check(int padid, short delay); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#NumberOfPad,ra0
mov.h #Delay,ra1
call init_reset_check 

《解説》
init_reset_check は reset_check を初期化します。int padid にはリセットが有効な
全てのパッドをビットで指定します。pad00〜pad05 は bit0〜5 に、pad10〜pad15 は 
bit8〜13 に対応しています。
short delay には、ディレイド・リセットの待ち時間を reset_check の呼び出し回数
で指定します。 

《関連事項》
int reset_check(void);
void soft_reset(void); 

《注意》
標準6Bパッドとボタンのビット位置が異るデバイスには対応していません。
デバイスのチェックをしてから使ってください。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
:
init_reset_check(0x0001 /* pad 1 only */, 3);
:


■６．21  パッドからリセット操作がされたか判定


《名称》
reset_check

《形式》
#include <system.h>
#include <v93.h>
int reset_check(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call reset_check

《解説》
reset_check は init_reset_check で指定された全てのパッドについて順番にリセット
操作(RUN + SELECT)が行われたかどうか確かめます。リセット操作が行なわれていたパ
ッドの番号を pad00〜pad05 は bit 0〜5 に、pad10〜pad15 は bit 8〜13 として返し
ます。また、指定された回数の間リセット操作が保持されていたパッドは、その番号
を pad00〜pad05 は bit 16〜21 に、pad10〜pad15 は bit 24〜29 として返します。

《関連事項》
void init_reset_check(int padid, short delay);
void soft_reset(void); 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
int status;
:
status = reset_check();
:


■６．22  soft_reset ベクタにジャンプ


《名称》
soft_reset

《形式》
#include <system.h>
#include <v93.h>
void soft_reset(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call soft_reset 

《解説》
soft_reset ベクタにジャンプします。 
HuC6273を使用しているプログラムは、必ずHuC6270を表示するモードに切り替えてから
soft_resetを呼ぶようにしてください。IPL_ROMでは表示モードを切り替えません。

《関連事項》
void init_reset_check(int padid, short delay);
int reset_check(void); 


■６．23  タイマを初期化


《名称》
init_timer

《形式》
#include <system.h>
#include <v93.h>
void init_timer(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call init_timer 

《解説》
タイマを初期化します。

《関連事項》
void start_timer(u_short interval, int irqsw);
void stop_timer(void); 


■６．24  タイマのカウンタ初期値を設定し、カウントを開始


《名称》
start_timer

《形式》
#include <system.h>
#include <v93.h>
void start_timer(u_short interval, int irqsw); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.h #IntervalValue,ra0
mov.w#IRQmode,ra1
call start_timer 

《解説》
タイマのカウンタ初期値を u_short interval の内容で設定し、カウントを開始しま
す。int irqsw を TIMER_IRQ_ON で指定したときには、タイマ割り込みを有効にし
TIMER_IRQ_OFF を指定したときには無効に設定します。 

《関連事項》
void init_timer(void);
void stop_timer(void); 

《注意》
int irqsw は、割り込みを起すかどうかのみ設定します。実際に割り込みを利用すると
きには、CPU その他の設定が必要です。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
:
start_timer(1, TIMER_IRQ_OFF);
:


■６．25  タイマのカウントを停止


《名称》
stop_timer

《形式》
#include <system.h>
#include <v93.h>
void stop_timer(void); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
call stop_timer 

《解説》
タイマのカウントを停止します、割り込みの要求、許可ビットは壊しません。

《関連事項》
void init_timer(void);
void start_timer(u_short interval, int irqsw);


■６．26  mram を指定データでフィル


《名称》
fill_mram

《形式》
#include <system.h>
#include <v93.h>
void fill_mram(int sadr, int value, int len);

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#Addr,ra0
mov.w#Value,ra1
mov.w#Length,ra2
call fill_vram 

《解説》
fill_mram は int sadr をワード境界まで切上げたアドレスから、int len をワード単
位で切捨てたバイト数だけ、int value をワード単位でフィルします。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
int adr;
int len;
:
fill_mram(adr, 0, len);
:


■６．27  reg_set, reg_setb のテーブル領域を初期化


《名称》
init_reg_set_tb

《形式》
#include <system.h>
#include <v93.h>
void init_reg_set_tb(int *queue_tbl, int table_length); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#QueueTblPointer,ra0
mov.w#Length,ra1
call init_reg_set_tb 

《解説》
init_reg_set_tb は、reg_set, reg_setb で参照するテーブル領域の初期化を行いま
す。

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
int *queue_tbl;
int tbllen;
:
init_reg_set_tb(queue_tbl, tbllen);
:


■６．28  テーブルに書かれた内容をデバイスにセット


《名称》
reg_set

《形式》
#include <system.h>
#include <v93.h>
void reg_set(int *queue_tbl, u_short *ar_adr); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#QueueTblPointer,ra0
mov.w#AR_Addr,ra1
call reg_set 

《解説》
reg_set は、u_short *ar_adr で AR のアドレスを指定された AR/DR 型の 16/32 Bit 
Bus デバイスに、int *queue_tbl の内容を書き込みます。 

《注意》
大量のデータ(パレットデータ、フォントなど)を転送するのには向いていません。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
int *queue_tbl;
u_short *ar_adr;
:
reg_set(queue_tbl, ar_adr);
:


■６．29  テーブルに書かれた内容をデバイスにセット


《名称》
reg_setb

《形式》
#include <system.h>
#include <v93.h>
void reg_setb(int *queue_tbl, u_short *io_base_adr); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#QueueTblPointer,ra0
mov.w#IO_BaseAdr,ra1
call reg_setb 

《解説》
reg_setb は、u_short *io_base_adr でベースアドレスを指定された 8 Bit Bus デバ
イスに、int *queue_tbl の内容を書き込みます。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
int *queue_tbl;
u_short *io_adr;
:
reg_setb(queue_tbl, io_adr);
:


■６．30  reg_set のテーブルにデータをセット


《名称》
req_reg_set

《形式》
#include <system.h>
#include <v93.h>
int req_reg_set(int *queue_tbl, int regno, int data, int size); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w #QueueTblPointer,ra0
mov.w #Regno,ra1
mov.w #Data,ra2
mov.w #Size,ra3
call req_reg_set 

《解説》
req_reg_set は、int *queue_tbl で示される reg_set へのテーブルに intregno, int 
data の内容をセットします。int size が 4 であるときには、intdata をワードデー
タとしてセットします。すでに int *queue_tbl の領域を使いきっているときには 0 
を返し、通常はそれ以外を返します。
reg_set によって、int regno はデバイスの AR に、int data はデバイスの DRに書き
込まれます。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
int *queue_tbl;
int regno, data, size;
:
req_reg_set(queue_tbl, regno, data, size);
:


■６．31  reg_setb のテーブルにデータをセット


《名称》
req_reg_setb

《形式》
#include <system.h>
#include <v93.h>
int req_reg_setb(int *queue_tbl, int regofs, int data); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "c62dev.sh"
include "v93.sh" 
mov.w#QueueTblPointer,ra0
mov.w#RegOffset,ra1
mov.w#Data,ra2
call req_reg_setb 

《解説》
req_reg_setb は、int *queue_tbl で示される reg_setb へのテーブルに intregofs, 
int data の内容をセットします。すでに int *queue_tbl の領域を使いきっていると
きには 0 を返し、通常はそれ以外を返します。
reg_setb によって、ベースアドレスに int regofs を加えたアドレスに intdata の内
容がバイトで書き込まれます。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <v93.h>
int *queue_tbl;
int regofs, data;
:
req_reg_setb(queue_tbl, regofs, data);
:


■６．32  ROM フォントのコードに対するフォントのアドレスを返す


《名称》
font_adrs

《形式》
#include <system.h>
#include <romfont.h>
char *font_adrs(int code, int fontset); 

《ｱｾﾝﾌﾞﾗ形式》 ＊
include "romfont.sh" 
mov.w#SJIScode,ra0
mov.w#FontsetNum,ra1
call font_adrs 

《解説》
font_adrs は、int code に与えた Shift-JIS の漢字コードに対応する ROM 内蔵フォ
ントの先頭アドレスを返します。ANK, 記号に関しては 基本的に ASCII コードで指定
します。int fontset で示したフォントセットに該当するフォントが存在しない場合は 
NULL(0) が返されます。int fontset に指定可能なフォントセットには、KANJI16x16, 
KANJI12x12, ANK8x16, ANK6x12, ANK8x8, ANK8x12があります。 

《ﾌﾟﾛｸﾞﾗﾑ例》
#include <system.h>
#include <romfont.h>
char *fontadr;
:
fontadr = font_adrs('あ', KANJI16x16);
:


＊……アセンブラを利用する際、使用するものです。
  尚、「ＧＭＡＫＥＲ」スタータキットではアセンブラはサポートされておりません。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

付録  PC-FXGA内蔵ROMフォントパターンデータ構成図


KANJI16×16

           ＋−−−−−−−−−−−   32バイト   −−−−−−−−−−−−−−＋
           ＋−＋−＋−＋−＋−＋−＋−＋−＋−−＋−＋−＋−＋−＋−＋−＋−＋
           ｜01｜02｜03｜04｜05｜06｜07｜08｜ 〜 ｜26｜27｜28｜29｜30｜31｜32｜
           ＋−＋−＋−＋−＋−＋−＋−＋−＋−−＋−＋−＋−＋−＋−＋−＋−＋
          ／    ＼  ＼                
        ／        ＼  ￣￣￣＼        
      ／            ＼        ￣￣￣＼
 ＋   □□□□□□□□□□□□□□□□
 ｜   □□□□□□□□■□□□□□□□
 ｜   □□□□□□□□■□□□□□□□
 ｜   □□□□□□□■□■□□□□□□
 ｜   □□□□□□□■□■□□□□□□
 ｜   □□□□□□■□□□■□□□□□
 ｜   □□□□□□■□□□■□□□□□
 16   □□□□□■□□□□□■□□□□
 ｜   □□□□□■□□□□□■□□□□
 ｜   □□□□■■■■■■■■■□□□
 ｜   □□□□■□□□□□□□■□□□
 ｜   □□□■□□□□□□□□□■□□
 ｜   □□□■□□□□□□□□□■□□
 ｜   □□■■■□□□□□□□■■■□
 ｜   □□□□□□□□□□□□□□□□
 ＋   □□□□□□□□□□□□□□□□
BIT   7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 




KANJI12×12

          ＋−−−−−−−−−−−   18バイト   −−−−−−−−−−−−−−＋
          ＋−＋−＋−＋−＋−＋−＋−＋−＋−−＋−＋−＋−＋−＋−＋−＋−＋
          ｜01｜02｜03｜04｜05｜06｜07｜08｜ 〜 ｜12｜13｜14｜15｜16｜17｜18｜
          ＋−＋−＋−＋−＋−＋−＋−＋−＋−−＋−＋−＋−＋−＋−＋−＋−＋
         ／    ＼  ＼
       ／        ＼  ￣￣￣＼
     ／            ＼        ￣￣￣＼
     □□□□□□□□□□□□□□□□     ＋   □□□□□□□□□□□□
     □■■□□□□□□□□□□■■□     ｜   □□□□□■■□□□□□
     □□□□□□□□■□□■□□□□     ｜   □□□□□■■□□□□□
     □□□□■□□■□□□□□□□■     ｜   □□□□■□□■□□□□
     □□□□■□□□□□□■□□□□     ｜   □□□□■□□■□□□□
     ■□□□□□□■■■■■■□□□     12   □□□■□□□□■□□□
     □□■□□□□□□■□□□□■□     ｜   □□□■□□□□■□□□
     □□□□□■□□□■■■□□□□     ｜   □□□■■■■■■□□□
     ■■■□□□□□□□□□□□□□     ｜   □□■□□□□□□■□□
 BIT 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0      ｜   □□■□□□□□□■□□
                                          ｜   □■■■□□□□■■■□
                                          ＋   □□□□□□□□□□□□




ANK8×16

             ＋−−−−−−−−−−−− 16バイト −−−−−−−−−−−−−−＋
             ＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋
             ｜01｜02｜03｜04｜05｜06｜07｜08｜09｜10｜11｜12｜13｜14｜15｜16｜
             ＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋
            ／    ＼     
          ／        ＼   
        ／            ＼ 
   ＋   □□□□□□□□ 
   ｜   □□□■■□□□ 
   ｜   □□□■■□□□ 
   ｜   □□■□□■□□ 
   ｜   □□■□□■□□ 
   ｜   □□■□□■□□ 
   ｜   □□■□□■□□ 
   16   □□■□□■□□ 
   ｜   □□■■■■□□ 
   ｜   □■□□□□■□ 
   ｜   □■□□□□■□ 
   ｜   □■□□□□■□ 
   ｜   □■□□□□■□ 
   ｜   □■□□□□■□ 
   ｜   □□□□□□□□ 
   ＋   □□□□□□□□ 
  BIT   7 6 5 4 3 2 1 0  




ANK6×12

             ＋−−−−−−−− 12バイト −−−−−−−−−−＋
             ＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋
             ｜01｜02｜03｜04｜05｜06｜07｜08｜09｜10｜11｜12｜
             ＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋
            ／    ＼        
          ／        ＼      
        ／            ＼    
   ＋   □□□□□□□□    
   ｜   □□■□□□□□    
   ｜   □□■□□□□□    
   ｜   □■■■□□□□    
   ｜   □■□■□□□□    
   12   □■□■□□□□    
   ｜   ■□□□■□□□    
   ｜   ■■■■■□□□    
   ｜   ■□□□■□□□    
   ｜   ■□□□■□□□    
   ｜   ■□□□■□□□    
   ＋   □□□□□□□□    
  BIT   7 6 5 4 3 2 1 0     
                   ＋−＋   
                    使用せず




ANK8×12

             ＋−−−−−−−− 12バイト −−−−−−−−−−＋
             ＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋
             ｜01｜02｜03｜04｜05｜06｜07｜08｜09｜10｜11｜12｜
             ＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋−＋
            ／    ＼    
          ／        ＼  
        ／            ＼
   ＋   □□□■□□□□
   ｜   □□■□■□□□
   ｜   □■□□□■□□
   ｜   □■□□□■□□
   ｜   ■□□□□□■□
   ｜   ■□□□□□■□
   12   ■□□□□□■□
   ｜   ■■■■■■■□
   ｜   ■□□□□□■□
   ｜   ■□□□□□■□
   ｜   ■□□□□□■□
   ＋   ■□□□□□■□
  BIT   7 6 5 4 3 2 1 0 




ANK8×8

             ＋−−−−−  8バイト   −−−−＋
             ＋−＋−＋−＋−＋−＋−＋−＋−＋
             ｜01｜02｜03｜04｜05｜06｜07｜08｜
             ＋−＋−＋−＋−＋−＋−＋−＋−＋
            ／    ＼    
          ／        ＼  
        ／            ＼
   ＋   □□■■■□□□
   ｜   □■□□□■□□
   ｜   ■□□□□□■□
   ｜   ■□□□□□■□
   8    ■■■■■■■□
   ｜   ■□□□□□■□
   ｜   ■□□□□□■□
   ＋   □□□□□□□□
  BIT   7 6 5 4 3 2 1 0 

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

《著作権及び登録商標等》

・VLIB.A 及び VLIB.TXT（以下、"本ソフトウェア"という）は、ＰＣ−ＦＸＧＡ用のソ
  フトウェア開発ツールの一部です。本ソフトウェアを、ＰＣ−ＦＸ、ＰＣ−ＦＸＧＡ
  用のソフトウェア開発以外の目的で使用しないで下さい。

・本ソフトウェアを使用した結果、直接及び間接的に生じた損害について、株式会社ハ
  ドソンは、一切の責任または債務を負わないものとします。

・本ソフトウェアの操作方法、技術的内容、その他の質問について、株式会社ハドソン
  では、直接お答えしていません。お問い合わせはご遠慮下さい。

・本ソフトウェアの使用に際し、「ソフトウェアのご使用条件」をよくご覧いただき、
  ご利用下さいますようお願い致します。

・本ソフトウェアの著作権は、株式会社ハドソンが保有しています。


MS-DOSは米国マイクロソフト社の登録商標です。
その他、記載されている会社名、製品名は、各社の登録商標または商標です。


                                                            (C)1995 HUDSON SOFT
